题目链接:http://poj.org/problem?id=3616
题意:人从奶牛身上挤奶有m个时间段(1----n),每个时间段包含 s e f 表示从 s 到 e 的这段时间可以获得 f 单位的牛奶,每次一个时间段结束后休息 r 小时进入下一时间段
我们可以把休息的r小时加到每个时间段的结束时间上,这样就可以直接进入下一时间断了,我们按开始时间排序。。
然后就类似于最长上升子序列了

#include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; #define N 1100 struct node { int s, e, f; }a[N]; int cmp(node p, node q) { if(p.s!=q.s) return p.s<q.s; return p.e<q.e; } int dp[N]; int main() { int n, m, r; while(scanf("%d %d %d", &n, &m, &r)!=EOF) { memset(a, 0, sizeof(a)); memset(dp, 0, sizeof(dp)); for(int i=0; i<m; i++) { scanf("%d%d%d", &a[i].s, &a[i].e, &a[i].f); a[i].e+=r; } sort(a, a+m, cmp); int ans=0; for(int i=0; i<m; i++) { dp[i] = a[i].f; for(int j=0; j<i; j++) { if(a[j].e<=a[i].s) { dp[i]=max(dp[i], dp[j]+a[i].f); } } ans=max(ans, dp[i]); } printf("%d ", ans); } return 0; }