poj 3616 Milking Time -DP(带权重的区间动态规划)
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; } }