POJ 3616 Milking Time

题目链接:http://poj.org/problem?id=3616

简单DP,任务调度问题,动态规划。

大体题意是说奶牛在不同时间的产奶量是不同的,而且每次完成一个阶段的产奶,都得休息R小时,给出奶牛在某时间内的产奶量(时间可能重叠),求出在全部时间内,奶牛的最大产奶量。

首先先将这些时间段按照结束时间先后排序。

递推方程式:dp[i]=max(dp[i-1],dp[p(i)]+w[i]) ; 其中,p(i)是一个函数,返回在第i段时间段之前的第一结束时间和该段开始时间相差R小时的时间段的编号

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
struct job
{
	int b,e,w;
};
int dp[1005];
job ob[1005];
int N,M,R;
int p(int i)
{
	for(int j=i-1;j>=0;j--)
	{
		if(ob[i].b>=ob[j].e+R)
			return j;
	}
    return 0;
}
bool cmp(job a,job b)
{
	if(a.e==b.e)
		return a.b<b.b;
	return a.e<b.e;
}
int main()
{
	scanf("%d%d%d",&N,&M,&R);
	for(int i=1;i<=M;i++)
		scanf("%d%d%d",&ob[i].b,&ob[i].e,&ob[i].w);
	sort(ob+1,ob+1+M,cmp);
	dp[0]=0;
	dp[1]=ob[1].w;
	for(int i=1;i<=M;i++)
	{
		dp[i]=max(dp[i-1],dp[p(i)]+ob[i].w);
	}
	printf("%d\n",dp[M]);
	return 0;
}


你可能感兴趣的:(dp,任务调度,ACM,poj)