http://poj.org/problem?id=3616
输入m,n,r。
一头牛在1-m时间内要产奶,n个时间段,每个时间段产量不同,有点开始就不能结束,并且每次产玩都要休息r分钟,问你如何分配次数能让奶最多
(每次休息的时候可能会和其他时间段有交叉,那样那个时间段就不能产奶了,问的就是这个问题)
简单的不得了。。
dp[i]=max(dp[i],dp[j]+vali);i为截止当前段内,最大的奶量
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
/*给定你一个牛,和你挤奶的时间。
在这段时间内,牛的奶量是不同的,问你如何
搭配时间,这样他的奶量最大
挤一次就要休息一段时间,这一段时间可能会错过奶量更大的
,所以就是要解决这个问题。
*/
const int maxn=1020;
vector<pair<pair<int,int>,int> >v;
bool cmp2(pair<pair<int,int>,int>a,pair<pair<int,int>,int> b){
if(a.first.first==b.first.first)
return a.first.second<b.first.second;
return a.first.first<b.first.first;
}
int main()
{ int dp[maxn];
int m,n,r;
int a,b,c;
while(~scanf("%d%d%d",&m,&n,&r))
{ v.clear();
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
v.push_back(make_pair(make_pair(a,b),c));
}
sort(v.begin(),v.end(),cmp2);
for(int i=0;i<v.size();i++){
dp[i]=v[i].second;
for(int j=0;j<i;j++){
if(v[j].first.second+r<=v[i].first.first)
dp[i]=max(dp[i],dp[j]+v[i].second);
}
}
int ans=-1;
for(int i=0;i<v.size();i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}