poj3616 LIS变形

时间:2021-09-29 14:09:31

题目链接: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[]; int cmp(Node a,Node b)
{
if(a.l==b.l) return a.r<b.r;
else return a.l<b.l;
} int dp[]; ///dp[i]代表最第i个时刻能产生牛奶的最大值 int main()
{
int N,M,R;
while(scanf("%d%d%d",&N,&M,&R)==)
{
for(int i=; i<=M; i++)
scanf("%d%d%d",&node[i].l,&node[i].r,&node[i].w);
sort(node+,node++M,cmp);
for(int i=; i<=M; i++)
dp[i]=node[i].w;
for(int i=; i<=M; i++)
for(int j=; j<i; j++)
if(node[i].l>=node[j].r+R)
dp[i]=max(dp[i],dp[j]+node[i].w);
sort(dp+,dp+M+);
printf("%d\n",dp[M]);
}
return ;
}