挑战练习题2.3动态规划 poj3616Milking Time dp

来源:互联网 发布:数据库字符串截断 编辑:程序博客网 时间:2024/05/17 02:52

题目链接:

http://poj.org/problem?id=3616

题意:

奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。

题解:

定义dp[i]表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和。dp[i]满足如下递推关系:
第i个时间段挤奶的最大值 = 前 i – 1 个时间段挤奶最大值中的最大值 + 第i次产奶量。

代码:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e3+10;struct node{    int l,r,e;    bool operator<(const node& rhs)const{        return l < rhs.l;    }}cow[maxn];int dp[maxn];int main(){    int N,M,R;    cin >> N >> M >> R;    for(int i=0; i<M; i++){        cin >> cow[i].l >> cow[i].r >> cow[i].e;        cow[i].r += R;    }    sort(cow,cow+M);    // dp[i] : 表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和    for(int i=0; i<M; i++){        dp[i] = cow[i].e;        for(int j=0; j<i; j++){            if(cow[j].r <= cow[i].l)                dp[i] = max(dp[i],dp[j]+cow[i].e);        }    }    cout << *max_element(dp,dp+M) << endl;    return 0;}
0 0