题目链接POJ3161
题意:
一头奶牛为自己未来 n 小时的产奶做规划,共有m个时间段,每个时间段用三个字母表示,s:该时段开始时间,d:该时段结束时间,p:该时间段产奶量。并且每次产完奶之后需要休息 r 小时休息才能进行下一次产奶。问最大产奶量是多少?
分析:
这也是一道求子序列的题目,该子序列需要满足的条件是1.和最大;2.子序列中前一个元素的结束时间+休息时间 < 下一个元素的开始时间。然后仿照最长递增子序列的写法就可以了。
#include <iostream>
#include <algorithm>
#define M 1005
#define fp(PP,QQ,RR) for(int PP = QQ;PP < RR;PP ++)
using namespace std;
int n,m,r,dp[M];
struct node{
int s,e,p;
};
node arr[M];
bool cmp(node n1,node n2){
return n1.s < n2.s;
}
int main(void)
{
cin >> n >> m >> r;
fp(i,0,m){
cin >> arr[i].s >> arr[i].e >> arr[i].p;
}
sort(arr,arr + m,cmp);
fp(i,0,m){
dp[i] = arr[i].p;
fp(j,0,i){
if(arr[j].e + r <= arr[i].s)
dp[i] = max(dp[i],dp[j] + arr[i].p);
}
}
cout << *max_element(dp,dp + m) << endl;
return 0;
}