版权声明:时间是有限的,知识是无限的,那就需要在有限的时间里最大化的获取知识。 https://blog.csdn.net/Fire_to_cheat_/article/details/82946593
【简单DP】POJ - 3616 Milking Time
https://vjudge.net/problem/POJ-3616
题意:
给出m个可以获取牛奶的时间段,每获取一次牛奶后就要休息R时间。
问你最多可以获取多少牛奶,获取牛奶的时间段不能分割开。
思路:
对区间段按右端点排序,类似最长上升子序列的DP思路
FOR(i,1,m)
FOR(j,1,i)
dp[i]=max(dp[i],dp[j]+w[i]);
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=1e6+10;
int dp[MAXN+10];
int n,m,r;
struct Node
{
int s,t;
int e;
}node[MAXN];
bool cmp(Node a,Node b)
{
return a.t<b.t;
}
int main()
{
cin>>n>>m>>r;
for(int i=1;i<=m;i++)
cin>>node[i].s>>node[i].t>>node[i].e;
sort(node+1,node+1+m,cmp);
int ans=0;
for(int i=1;i<=m;i++)
{
dp[i]=node[i].e;
for(int j=1;j<=i;j++)
{
if(node[j].t+r<=node[i].s)
dp[i]=max(dp[i],dp[j]+node[i].e);
}
ans=max(dp[i],ans);
}
cout<<ans<<endl;
return 0;
}