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. ueditor 插件问题

  2. 使用UserLock如何实现工作站登陆访问限制

    UserLock允许用户限制受保护账户可登陆的工作站/终端.工作站/终端限制可以通过设置或者使用特定的IP范围,计算机名/IP或组织单位实现. 对于每个工作站限制你需要指定所要限制的会话类型(默认情况 ...

  3. C++ 0x

  4. 腾讯bugly 映射用法

    package com.tencent.bugly.agent; import android.app.Activity; import android.content.Context; import ...

  5. Struts2_Action和Result总结

    Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...

  6. 获取当前事件对象及this的用法

    js <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta h ...

  7. ABAP Netweaver和Hybris里获得内存使用统计数据

    ABAP Netweaver 事物码ST06 Hybris 每隔5秒钟,Hybris Administration console会发起一个到Java后台的AJAX查询请求: 这个5秒的时间间隔定义在 ...

  8. cesium 加载倾斜摄影模型(这里有一坑)

    代码如下: // Construct the default list of terrain sources. var terrainModels = Cesium.createDefaultTerr ...

  9. IOS transform的使用(移动,放大,旋转)

    @interface ViewController () - (IBAction)up; - (IBAction)big ; - (IBAction)leftRotate ; @property (n ...

  10. 在写EF 时把时间格式化的做法

    SELECT COUNT(l.LogSeq), date_format(l.CreateDate,'%Y-%m') CreateDateByMonth FROM LOL l WHERE l.Creat ...