POJ 3616 Milking Time 【DP】
题意:奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。
思路:一定是对时间段dp,然后就是两个for的事了。只要前面能满足条件的状态就可以转移过来,然后取最大,不过要先排序。
状态设定:dp[i]表示从开始取,到满足取第i段的最优值。
定义dp[i]表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和。dp[i]满足如下递推关系
if(e[i].x>=e[j].y+r)
dp[i]=max(dp[i],dp[j]+e[i].w);
#include <iostream> #include <cstdio> #include <queue> #include <math.h> #include <string.h> #include <string> #include <algorithm> using namespace std; struct eg { int x,y,w; }e[1005]; bool cmp(eg a,eg b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int main() { int n,m,r,dp[1005],ans; scanf("%d%d%d",&n,&m,&r); for(int i=0;i<m;i++) { scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w); } sort(e,e+m,cmp); ans=0; for(int i=0;i<m;i++) dp[i]=e[i].w; for(int i=0;i<m;i++) { for(int j=0;j<i;j++) { if(e[i].x>=e[j].y+r) dp[i]=max(dp[i],dp[j]+e[i].w); } ans=max(ans,dp[i]); } printf("%d",ans); return 0; }