题目大意:奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。
于每一次挤奶,结束时间+=休息时间.
先把m次挤奶按照开始时间排个序,用dp[i]表示挤完第i个时间段的奶以后的最大挤奶量,那么有:
dp[i]=max(dp[i],dp[j]+(第i次挤奶.sum)) (1<=j<i&&(第j次挤奶).e<=(第i次挤奶).s).
题目链接http://poj.org/problem?id=3616
ac代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define maxn 10005
int dp[maxn],a[maxn],ans;
struct node{
int s,e,sum;
}p[10005];
bool cmp(const node &a,const node &b)
{
if(a.s==b.s)
return a.e<b.e;
return a.s<b.s;
}
int main()
{
int n,m,r;
cin>>n>>m>>r;
for(int i=0;i<m;i++)
{
cin>>p[i].s>>p[i].e>>p[i].sum;
p[i].e+=r;
}
sort(p,p+m,cmp);
ans=0;
for(int i=0;i<m;i++)
{
dp[i]=p[i].sum;
for(int j=0;j<i;j++)
{
if(p[i].s>=p[j].e)
dp[i]=max(dp[i],dp[j]+p[i].sum);//状态转换方程
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}