题目链接: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;
}