【简单DP】【线性】POJ - 3616 Milking Time

版权声明:时间是有限的,知识是无限的,那就需要在有限的时间里最大化的获取知识。 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;
}

猜你喜欢

转载自blog.csdn.net/Fire_to_cheat_/article/details/82946593