[kuangbin带你飞]专题十二 基础DP1 R POJ 3616

来源:互联网 发布:java soa 框架 编辑:程序博客网 时间:2024/06/03 16:10

题目地址:https://vjudge.net/contest/68966#problem/R

思路:把时间段按照开始时间排序,然后从第一个时间段开始,往前找能接上去的且使得值最大的另一个时间段。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxm=1000+10;struct pos{    int s,e;    long long n;}t[maxm];long long dp[maxm];int n,m,r;bool cmp(pos a,pos b){    if(a.s==b.s)        return a.e<b.e;    return a.s<b.s;}int main(){    while(~scanf("%d%d%d",&n,&m,&r))    {        for(int i=1;i<=m;i++)        {            scanf("%d%d%I64d",&t[i].s,&t[i].e,&t[i].n);            t[i].e+=r;        }        memset(dp,0,sizeof(dp));        sort(t+1,t+1+m,cmp);        for(int i=1;i<=m;i++)        {            dp[i]=t[i].n;             for(int j=i-1;j>=1;j--)             {                 if(t[i].s>=t[j].e)                 {                     dp[i]=max(dp[i],dp[j]+t[i].n);                 }             }        }        long long ans=0;        for(int i=1;i<=m;i++)            if(ans<dp[i])                ans=dp[i];        printf("%I64d\n",ans);    }}


0 0
原创粉丝点击