Milking Time

Time Limit: 1000MS Memory Limit: 65536K

Total Submissions: 12324 Accepted: 5221

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 ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as possible.

Farmer John has a list of M (1 ≤ M ≤ 1,000) possibly overlapping intervals in which he is available for milking. Each interval i has a starting hour (0 ≤ starting_houri ≤ N), an ending hour (starting_houri < ending_houri ≤ N), and a corresponding efficiency (1 ≤ efficiencyi ≤ 1,000,000) which indicates how many gallons of milk that he can get out of Bessie in that interval. Farmer John starts and stops milking at the beginning of the starting hour and ending hour, respectively. When being milked, Bessie must be milked through an entire interval.

Even Bessie has her limitations, though. After being milked during any interval, she must rest R (1 ≤ R ≤ N) hours before she can start milking again. Given Farmer Johns list of intervals, determine the maximum amount of milk that Bessie can produce in the N hours.

Input

  • Line 1: Three space-separated integers: N, M, and R
  • Lines 2..M+1: Line i+1 describes FJ’s ith milking interval withthree space-separated integers: starting_houri , ending_houri , and efficiencyi

Output

  • Line 1: The maximum number of gallons of milk that Bessie can product in the N hours

Sample Input

12 4 2

1 2 8

10 12 19

3 6 24

7 10 31

Sample Output

43


解题心得:

  1. 题意就是有m头牛,每一只牛有一个产奶的时间段和一个奶量,Bessie可以去给每一头奶牛挤奶,但是每次给一个奶牛挤奶之后必须休息R分钟,问Bessie选择怎么挤奶可以使挤出的奶最多。
  2. 最直观的的方法还是记忆化搜索,不用去推状态转移方程式,直接跟着题意走就行了。但是如果要推状态转移方程式就有很多种方法了,看过其他大佬最简单的方法就是按照每一只牛的时间段来转移,dp[i]表示按开始产奶的时间顺序处理第i头牛可以获得的最大的产奶量,转移方程可以从前面j头牛(如果第j头牛的时间符合)+第i头牛产的奶来更新dp[i]的最大值。其实这个状态转移就讲记忆化搜索提炼出来的公式,具体的看代码吧。

记忆化搜索的代码:

#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;
const int maxn = 1010;
int n,m,R; struct COW {
int l,r,va;
}cow[maxn]; long long dp[maxn*maxn]; bool cmp(COW a, COW b) {
return a.l < b.l;
} void init() {
memset(dp,-1,sizeof(dp));
scanf("%d%d%d",&n,&m,&R);
for(int i=0;i<m;i++) {
scanf("%d%d%d",&cow[i].l,&cow[i].r,&cow[i].va);
}
sort(cow,cow+m,cmp);
} long long dfs(int num,int Time) {
long long k0 = 0,k1 = 0;
if(num >= m || Time >= n)
return 0;
if(dp[Time] != -1 && Time != -1)
return dp[Time];
if(cow[num].l >= Time && cow[num].r <= n) { //如果时间符合那就加上当前这头牛的产奶量
k1 += dfs(num+1,cow[num].r+R) + cow[num].va;
} else
k1 += dfs(num+1,Time);//时间不符合直接检查下一头
k0 += dfs(num+1,Time);
return dp[Time] = max(k0,k1);
} int main() {
init();
long long ans = dfs(0,-1);
printf("%lld\n",ans);
return 0;
}

提炼出状态转移的公式之后的代码:

#include <algorithm>
#include <stdio.h>
using namespace std;
const int maxn = 1010;
struct COW {
int start_time,end_time,va; bool operator < (const COW &A) const {
return A.start_time > start_time;
}
}cow[maxn]; int dp[maxn]; int main() {
int n,m,R;
scanf("%d%d%d",&n,&m,&R);
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&cow[i].start_time,&cow[i].end_time,&cow[i].va);
cow[i].end_time += R;//实际结束的时间 = 结束时间 + 休息时间
} sort(cow+1,cow+m+1); for(int i=1;i<=m;i++) {
dp[i] = cow[i].va;
for(int j=1;j<i;j++) {
if(cow[j].end_time <= cow[i].start_time)
dp[i] = max(dp[i],dp[j] + cow[i].va);
}
} int ans = 0;
for(int i=0;i<=m;i++)
ans = max(ans,dp[i]);
printf("%d\n",ans); return 0;
}

POJ:3616-Milking Time的更多相关文章

  1. 【POJ】3616 Milking Time(dp)

    Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10898   Accepted: 4591 Des ...

  2. POJ 3616 Milking Time(加掩饰的LIS)

    传送门: http://poj.org/problem?id=3616 Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  3. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  4. POJ 2112 Optimal Milking (二分 + floyd + 网络流)

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...

  5. Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)

    题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...

  6. poj:4091:The Closest M Points

    poj:4091:The Closest M Points 题目 描写叙述 每到饭点,就又到了一日几度的小L纠结去哪吃饭的时候了.由于有太多太多好吃的地方能够去吃,而小L又比較懒不想走太远,所以小L会 ...

  7. 动态规划:POJ 3616 Milking Time

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  8. POJ 3616 Milking Time (排序+dp)

    题目链接:http://poj.org/problem?id=3616 有头牛产奶n小时(n<=1000000),但必须在m个时间段内取奶,给定每个时间段的起始时间和结束时间以及取奶质量 且两次 ...

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

    题目链接:http://poj.org/problem?id=3616 题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间.结束时间.生产效率(时间都不超过N),只能在给出的时间段内生产, ...

  10. poj 3616 Milking Time (基础dp)

    题目链接 http://poj.org/problem?id=3616 题意:在一个农场里,在长度为N个时间可以挤奶,但只能挤M次,且每挤一次就要休息t分钟: 接下来给m组数据表示挤奶的时间与奶量求最 ...

随机推荐

  1. android api 之Scroller

    Scroller是封装了滚动,实现View和ViewGroup的背景画布的滚动. 它有两个构造方法: public Scroller (Context context) 传递一个上下文. public ...

  2. Springboot开源项目实例整理

    https://www.imooc.com/article/67664 ---------------------------------------------------------------- ...

  3. selenium找不到元素

    1.页面元素处于不显示状态时,找不元素.必须使元素处于显示状态.使用js 或者 元素的点击事件等方式可以实现. " src="index.php?m=Index&a=Men ...

  4. shell去重

    sort命令可以对文本的内容进行排序 uniq命令可以对文本内容连续的内容进行去重,非连续的重复内容无法去重 sort 文件 | uniq 可以达到去除所有重复数据的目的(因为先排序了,这样相同的内容 ...

  5. 2.eclipse安装

    1.进入官网https://www.eclipse.org/ 2.配置工作目录:存放 1.项目代码    2.IDE相关配置信息 3.没有配置tomcat,所以为空.

  6. 5 - 文件I/O操作

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的 写文件 #打开data.txt,创建一个实例f f = open('data.txt','w') #向文件中写内容 f. ...

  7. 在你的andorid设备上运行netcore (Linux Deploy)

    最近注意到.net core 的新版本已经开始支持ARM 平台的CPU, 特意去Linux Deploy 中尝试了一下,真的可以运行 Welcome to Ubuntu 16.04 LTS (GNU/ ...

  8. May 8th 2017 Week 19th Monday

    Art lies in concealing art. 隐而不露即艺术. Sometimes, concealing is much more seductive than totally naked ...

  9. 如何用代码填充S/4HANA销售订单行项目的数量字段

    我的任务是用代码生成S/4HANA销售订单(Sales Order)的行项目,并且填充对应的quantity(数量)值. 最开始我用了下面的代码,把quantity的值写入item字段target_q ...

  10. express不是内部命令

    有时用npm install express -g安装完express时,在写express -v会显示express不是内部命令 这样的话如果自己的安装没有问题的话就要考虑到环境变量了 win7 P ...