POJ3616 Milking Time 简单DP

注意0,1,.....,N是时间点,i~i+1是时间段

然后就是思路:dp[i]代表到时间点 i 获得的最大价值,

1:dp[i]=max(dp[i],dp[s-r]+e),表示有以s为开头,i为结尾的工作时间,效率是e(保证前面有工作)

2:dp[i]=max(dp[i],e),表示前面没有工作

3:dp[i]=max(dp[i],dp[i-1]),保存到时间点i的最大价值

代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<cstdlib>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
struct asd
{
    int s,e;
};
vector<asd>a[1000001];
int dp[1000001];
int main()
{
    int n,m,r;
    scanf("%d%d%d",&n,&m,&r);
    for(int i=0; i<m; ++i)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        a[y].push_back((asd)
        {
            x,z
        });
    }
    for(int i=1; i<=n; ++i)
    {
        for(int j=0; j<a[i].size(); ++j)
        {
           int e=a[i][j].e;
           int s=a[i][j].s;
           dp[i]=max(dp[i],e);
           dp[i]=max(dp[i],dp[s-r]+e);
        }
        dp[i]=max(dp[i],dp[i-1]);
    }
    printf("%d
",dp[n]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/shuguangzw/p/5031146.html