poj3616 递推

来源:互联网 发布:淘宝如何秒杀一元产品 编辑:程序博客网 时间:2024/05/15 03:07

题目链接:点击打开链接


题意:

一只牛要在生产奶,它需要一个计划表;

农夫会有 m 次可能来挤奶;

每一次有起始时间 L,结束时间 R,挤的奶量 E;

而牛产完奶要休息 r 时间;

问如何安排才能得到最多的奶量,求出奶量;


理解:

脑子转不过来;

这儿只有一个像 dp 会使用到的变量 m;

所以要向一维 dp 转换思想;

找出递推式含义:dp[i] 表示以第 i 次为结束能挤到的最大奶量;

即:dp[i] = dp[j] + E[i];

其中满足:j.L + r <= i.R;

初始值为:dp[i] = E[i];

即:第 i 个既是第一个,又是最后一个;


代码如下:


#include <cstdio>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#include <stack>using namespace std;typedef long long LL;typedef pair<int, int> PII;const int MIN_INF = 1e-7;const int MAX_INF = (1e9) + 7;#define X first#define Y secondtypedef pair<PII, int> PPI;int dp[1010];bool cmp(PPI p1, PPI p2) {    if (p1.X.X == p2.X.X) {        return p1.X.Y < p2.X.Y;    }    return p1.X.X < p2.X.X;}int main() {    int n, m, r;    cin >> n >> m >> r;    vector<PPI> vec(m);    for (int i = 0; i < m; ++i) {        cin >> vec[i].X.X >> vec[i].X.Y >> vec[i].Y;    }    sort(vec.begin(), vec.end(), cmp);    int ans = -1;    for (int i = 0; i < m; ++i) {        dp[i] = vec[i].Y;        for (int j = 0; j <= i; ++j) {            if (vec[i].X.X >= vec[j].X.Y + r) {                dp[i] = max(dp[i], dp[j] + vec[i].Y);            }            ans = max(ans, dp[i]);        }    }    cout << ans << endl;    return 0;}


0 0