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;
}

 

posted @ 2016-11-03 21:52  a_clown_cz  阅读(138)  评论(0)    收藏  举报