poj3616 LIS变形
题目链接:http://poj.org/problem?id=3616
题意:给出m组数据a,b,c代表在第a分钟到第b分钟产生c个效益,问最大产生多少效益(区间不能重叠,每次工作完必须歇息R分钟)
//我好笨啊,这种简单的题目还是不会做,要看学长的代码才懂诶。慢慢练吧,没有办法。。
dp[i]代表最第排序后 node[i].r时刻时刻能产生牛奶的最大值
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct Node { int l,r,w; } node[1005]; int cmp(Node a,Node b) { if(a.l==b.l) return a.r<b.r; else return a.l<b.l; } int dp[1005]; ///dp[i]代表最第i个时刻能产生牛奶的最大值 int main() { int N,M,R; while(scanf("%d%d%d",&N,&M,&R)==3) { for(int i=1; i<=M; i++) scanf("%d%d%d",&node[i].l,&node[i].r,&node[i].w); sort(node+1,node+1+M,cmp); for(int i=1; i<=M; i++) dp[i]=node[i].w; for(int i=2; i<=M; i++) for(int j=1; j<i; j++) if(node[i].l>=node[j].r+R) dp[i]=max(dp[i],dp[j]+node[i].w); sort(dp+1,dp+M+1); printf("%d\n",dp[M]); } return 0; }