poj-3616 Milking Time (区间dp)
2015-04-21 09:42
435 查看
http://poj.org/problem?id=3616
bessie是一头工作很努力的奶牛,她很关心自己的产奶量,所以在她安排接下来的n个小时以尽可能提高自己的产奶量。
现在有m个产奶时间,每个都有一个开始时间和结束时间和这个时间内的产奶量,任意一个时间段产奶之后,bessie都要休息r个时间,问如果安排产奶才能得到最大值。
注意这里m个时间其实都安排在n时间内,所以n其实是没用的。
设dp[i]是前i个时间内最多的产奶量 dp[i]=max(dp[i-1],dp[p[i]]+w[i]);
p[i]是与dp[i]最大不相容区间的下标。
预处理出p[i],然后dp。
bessie是一头工作很努力的奶牛,她很关心自己的产奶量,所以在她安排接下来的n个小时以尽可能提高自己的产奶量。
现在有m个产奶时间,每个都有一个开始时间和结束时间和这个时间内的产奶量,任意一个时间段产奶之后,bessie都要休息r个时间,问如果安排产奶才能得到最大值。
注意这里m个时间其实都安排在n时间内,所以n其实是没用的。
设dp[i]是前i个时间内最多的产奶量 dp[i]=max(dp[i-1],dp[p[i]]+w[i]);
p[i]是与dp[i]最大不相容区间的下标。
预处理出p[i],然后dp。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct job { int s,t,w; bool operator < (const job &a) const { return t<a.t; } }; job p[1010]; int f[1010],dp[1010]; void compute(int m,int r) { f[1]=0; for(int i=2;i<=m;i++) { int k=i-1; while(k>0&&p[k].t+r>p[i].s) k--; f[i]=k; } } int main() { int n,m,r; while(~scanf("%d%d%d",&n,&m,&r)) { for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].s,&p[i].t,&p[i].w); sort(p+1,p+m+1); compute(m,r); memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) dp[i]=max(dp[i-1],dp[f[i]]+p[i].w); printf("%d\n",dp[m]); } return 0; }
相关文章推荐
- POJ 3616 Milking Time 挤奶问题,带权区间DP
- POJ 3616 Milking Time(区间DP)
- poj 3616 Milking Time 【区间DP】
- POJ 3616 Milking Time(DP,区间和最大)
- poj 3616 Milking Time ---DP(带权重的区间动态规划)
- Milking Time --poj 3616(区间dp)
- [dp]poj 3616 Milking Time 带权重的区间dp
- POJ - 3616 Milking Time(DP)
- POJ - 3616 Milking time (DP)
- POJ 3616-Milking Time (基础DP)
- POJ 3616 Milking Time(DP)
- POJ 3616 Milking Time(简单DP)
- POJ - 3616 Milking Time(dp)
- POJ 3616 Milking Time 基础DP
- POJ 3616 D - Milking Time(DP)
- poj3616——Milking Time(dp最大子序列)
- [ poj 3616] Milking Time [ DP ]
- POJ 3616 Milking Time (基础DP)
- POJ 3616 Milking Time 简单DP
- POJ 3616 Milking Time (排序+dp)