[2016-03-28][POJ][3616][Milking Time]

  • 时间:2016-03-28 17:27:03 星期一

  • 题目编号:[2016-03-28][POJ][3616][Milking Time]

  1. #include <algorithm>
  2. #include <cstdio>
  3. using namespace std;
  4. const int maxm = 1000 + 10;
  5. struct Roo{
  6. int l,r,v;
  7. bool operator < (const Roo & a)const{
  8. return l < a.l;
  9. }
  10. }a[maxm];
  11. int dp[maxm];
  12. int main(){
  13. int n,m,r;
  14. scanf("%d%d%d",&n,&m,&r);
  15. for(int i = 1;i <= m ; ++i){
  16. scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
  17. }
  18. sort(a+1,a+1+m);
  19. int ans = 0;
  20. for(int i = 1;i <= m;++i){
  21. dp[i] = a[i].v;
  22. for(int j = 1;j < i ; ++j){
  23. if(a[j].r + r <= a[i].l){
  24. dp[i] = max(dp[i],dp[j] + a[i].v);
  25. }
  26. }
  27. ans = max(dp[i],ans);
  28. }
  29. printf("%d\n",ans);
  30. return 0;
  31. }

来自为知笔记(Wiz)

时间: 2024-10-07 15:10:02

[2016-03-28][POJ][3616][Milking Time]的相关文章

POJ 3616 Milking Time DP题解

典型的给出区间任务和效益值,然后求最大效益值的任务取法. 属于一维DP了. 一维table记录的数据含义:到当前任务的截止时间前的最大效益值是多少. 注意, 这表示当前任务一定要选择,但是最终结果是不一定选择最后一个任务,故此最后需要遍历找到table数组的最大值,当然计算过程中使用一个数记录最终最大值也是可以的. 状态转移方程就是: tbl[i] = MAX({from tbl[0]->tbl[i-1] }+ weight[i] ),即区间0到i-1加上i的当前效益值. #include <

POJ 3616 Milking Time 挤奶问题,带权区间DP

题目链接:POJ 3616 Milking Time Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4837   Accepted: 2034 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to sc

POJ 3616 Milking Time(加掩饰的LIS)

传送门: http://poj.org/problem?id=3616 Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13406   Accepted: 5655 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she dec

poj 3616 Milking Time dp+树状数组

题意: 给一堆区间,每个区间有开始时间s,结束时间e,和收益w,现在要找一些区间使收益和最大,且区间之间的间隔最小为r. 分析: 这道题用dp做是简单题,用dp+树状数组做是中等题.dp问题的关键是对状态的定义.有两种方法,一:dp[k]表示按开始时间排序到第k个区间能取得的最大收益.二:dp[t]表示在时间t时能获得的最大收益.定义好状态方程就好写了这不再赘述.有趣的是这个时间复杂度.设一共有M个区间,所有区间的最大时间为L,第一种是M^2的,第二种是M*(logL+logM)的,这题M才10

POJ 3616 Milking Time 简单DP

题目链接:http://poj.org/problem?id=3616 题目大意:M个区间,每个区间一个对应一个效率值-多少升牛奶,区间可能重复,现要求取出来一些区间,要求是区间间隔不能小于R,问所能得到的牛奶量的最大值. 解题思路:决策:当前区间用或者不用.区间个数M≤1000,因此直接双循环递推即可. dp[i]:=选第i个区间情况下前i个区间能获得的牛奶最大值 dp[i] = max(dp[i], dp[j] + a[i].eff) a[j].end + r <= a[i].start 代

POJ 3616 Milking Time(最大递增子序列变形)

题目链接:http://poj.org/problem?id=3616 题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间.结束时间.生产效率(时间都不超过N),只能在给出的时间段内生产,要求合理安排时间求出最大生产价值. 解题思路:把区间按开始时间排序,于是有状态转移方程:dp[i]=max(dp[i],dp[j]+a[i].val)(前提是a[j].end+r<=a[i].start,i是区间的序号,j是i前面的区间) 相当于最大递增子序列的变形,写法差不多. 代码: 1 #in

POJ 3616 Milking Time (排序+dp)

题目链接:http://poj.org/problem?id=3616 有头牛产奶n小时(n<=1000000),但必须在m个时间段内取奶,给定每个时间段的起始时间和结束时间以及取奶质量 且两次取奶之间须间隔r-1个小时,求最大取奶质量 也就是说r = 2时 3分结束取奶,至少在5分才能取. 按照时间排序,dp[i]表示i时段的最大产奶量 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include &

POJ 3616 Milking Time 基础DP

Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5743   Accepted: 2401 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤

POJ 3616 Milking Time 动态规划

http://poj.org/problem?id=3616 题意:一个奶牛在0~N时间段内可被取奶,每次挤奶以后必须休息至少R分钟才能下次继续挤奶.有M次可以挤奶的时间段,每次取奶对应三个值:开始时间.结束时间.效率值,每次挤奶的过程不能中断.求出最大效率值. 解法:首先按照结束时间从小到大排序(按照结束时间排序方便后边的dp):dp[i]表示第i个挤奶时间段后,效率最大值. 转移方程如下: 初始化:dp[i] = data[i].eff #include <iostream> #inclu