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