首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

poj 3616 Milking Time -DP(带权重的区间动态规划)

2013-09-05 
poj 3616 Milking Time ---DP(带权重的区间动态规划)题目:http://poj.org/problem?id3616这题就是一个小

poj 3616 Milking Time ---DP(带权重的区间动态规划)

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

这题就是一个小小变形的带权重的任务调度问题 --interval scheduling--

思路:首先按照每个区间的结束时间排序,再进行预处理:算出与每个区间相互兼容的最大区间下标保存在P数组里。

状态:dp[i]=max{ dp[i-1],dp[p[i]]+w[i] } 

代码:1A

#include<iostream>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int MAX_M=1001;int dp[MAX_M],p[MAX_M];struct job{int s,t,w;};job njob[MAX_M];bool Cmp(job a,job b){return a.t<b.t;}bool Iscompatible(job a,job b,int R){if(b.s>=a.t+R || b.t+R<=a.s)return 1;else return 0;}void Calculate_P(int M,int R){p[1]=0;for(int i=M;i>1;i--){int k=i-1;while(k>0 && !Iscompatible(njob[i],njob[k],R))k--;p[i]=k;}}int main(){int N,M,R;while(cin>>N>>M>>R){for(int i=1;i<=M;i++){cin>>njob[i].s>>njob[i].t>>njob[i].w; } sort(njob+1,njob+1+M,Cmp);Calculate_P(M,R);memset(dp,0,sizeof(dp));for(int i=1;i<=M;i++){dp[i]=max(dp[i-1],dp[p[i]]+njob[i].w);}cout<<dp[M]<<endl;}}


热点排行