[POJ 3616]Milking Time[DP]
2016-01-14 11:27
387 查看
题目链接:[POJ 3616]Milking Time[DP]
题意分析:
给出M个区间,每个区间有对应的产奶量efficiency[i],奶牛每次挤完奶要休息R分钟,问:最大的挤奶量是多少?(农夫在起始分钟的开始处开始挤奶,在结束分钟的开始处结束挤奶)
解题思路:
设dp[i]为选择第i个区间可以得到的最大产奶量。dp[i] = max(dp[0 ~ i]) + efficiency[i]。由于选择的区间只对上面选择的区间影响,所以整个区间选择是个重复的子问题,而一旦选择了前面的区间,这后面的区间就与其没关系了,没有后效性。
个人感受:
一看题目我觉得很像01背包,然后想怎么表示状态,发现还得记录区间上限,复杂度感人。然后就GG了 = =。
具体代码如下:
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct Interval {
int ans, up, down;
bool operator < (const Interval &t)const {
if (down == t.down) return up < t.up;
return down < t.down;
}
}inter[1011];
int main()
{
int n, m, r; scanf("%d%d%d", &n, &m, &r);
for (int i = 0; i < m; ++i) {
scanf("%d%d%d", &inter[i].down, &inter[i].up, &inter[i].ans);
inter[i].up += r;
}
sort(inter, inter + m);
int ans = 0;
for (int i = 0; i < m; ++i) {
int mx = 0;
for (int j = 0; j < i; ++j) {
if (inter[j].up <= inter[i].down && inter[j].ans > mx)
mx = inter[j].ans;
}
inter[i].ans += mx;
ans = max(ans, inter[i].ans);
}
printf("%d\n", ans);
return 0;
}
题意分析:
给出M个区间,每个区间有对应的产奶量efficiency[i],奶牛每次挤完奶要休息R分钟,问:最大的挤奶量是多少?(农夫在起始分钟的开始处开始挤奶,在结束分钟的开始处结束挤奶)
解题思路:
设dp[i]为选择第i个区间可以得到的最大产奶量。dp[i] = max(dp[0 ~ i]) + efficiency[i]。由于选择的区间只对上面选择的区间影响,所以整个区间选择是个重复的子问题,而一旦选择了前面的区间,这后面的区间就与其没关系了,没有后效性。
个人感受:
一看题目我觉得很像01背包,然后想怎么表示状态,发现还得记录区间上限,复杂度感人。然后就GG了 = =。
具体代码如下:
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct Interval {
int ans, up, down;
bool operator < (const Interval &t)const {
if (down == t.down) return up < t.up;
return down < t.down;
}
}inter[1011];
int main()
{
int n, m, r; scanf("%d%d%d", &n, &m, &r);
for (int i = 0; i < m; ++i) {
scanf("%d%d%d", &inter[i].down, &inter[i].up, &inter[i].ans);
inter[i].up += r;
}
sort(inter, inter + m);
int ans = 0;
for (int i = 0; i < m; ++i) {
int mx = 0;
for (int j = 0; j < i; ++j) {
if (inter[j].up <= inter[i].down && inter[j].ans > mx)
mx = inter[j].ans;
}
inter[i].ans += mx;
ans = max(ans, inter[i].ans);
}
printf("%d\n", ans);
return 0;
}
相关文章推荐
- STM32按键总结(低电平有效及上升沿有效))
- MongoVUE 的使用
- dom4j读写xml
- LVS原理详解及部署之五:LVS+keepalived实现负载均衡&高可用
- Redis学习记录之命令SortedSet(十三)
- wing带你玩转自定义view系列(3)模仿微信下拉眼睛
- js中删除数组中的某一元素(无下标时)
- Android Service 之三(Bind Service,使用 AIDL)
- Redis的学习笔记
- wing带你玩转自定义view系列(3)模仿微信下拉眼睛
- [转载]轻量级Lua IDE ZeroBrane Studio 的使用技巧和汉化
- C# 雕虫小技
- Spring容器的继承
- Genre-based Music Recommendations Using Open Data (and the problem with recommender systems)
- JFFS2文件系统介绍
- druid连接池与数据库简单配置
- linux 下使用log4cxx服务
- LeetCode:Product of Array Except Self
- Java贪心算法 删数字问题
- 数据库设计三大范式