题目链接:
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_back
const 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;
}