poj 3616 奶牛产奶时间间隔dp
2015-07-02 19:24
323 查看
题意:
奶牛可以在1~n的时间内产奶,在这段时间内,fj有m个时间间隔可以助产奶,每次产过奶以后,奶牛要有r分钟的休息时间。
现在给出m个时间的st ed 和 产奶量val,求满足以上条件下,奶牛产的最多的奶是多少。
解析:
dp[ i ]表示从第0个区间到第i个区间的最大产奶量。
所以状态转移方程为:
if (p[i].ed + r <= p[j].st)
{
dp[j] = max(dp[j], dp[i] + p[j].val);
}
每次取这个区间,或者不取这个区间,求最大。
总结:
状态量的表示想对了,但是dp的过程出了问题,直接这样算了:
只递归前一个状态的值,无法起到表示当前这个时间间隔取,或者不取的效果。
因为我要往后递归的是两种情况:当前这个时间间隔取,然后往后递归找最大;当前这个时间间隔不取,然后往后递归找最大。
代码:
奶牛可以在1~n的时间内产奶,在这段时间内,fj有m个时间间隔可以助产奶,每次产过奶以后,奶牛要有r分钟的休息时间。
现在给出m个时间的st ed 和 产奶量val,求满足以上条件下,奶牛产的最多的奶是多少。
解析:
dp[ i ]表示从第0个区间到第i个区间的最大产奶量。
所以状态转移方程为:
if (p[i].ed + r <= p[j].st)
{
dp[j] = max(dp[j], dp[i] + p[j].val);
}
每次取这个区间,或者不取这个区间,求最大。
总结:
状态量的表示想对了,但是dp的过程出了问题,直接这样算了:
dp[0] = p[0].val; for (int i = 1; i < m; i++) { if (p[i - 1].ed + r <= p[i].st) { dp[i] = max(dp[i - 1], dp[i - 1] + p[i].val); } else { int j; for (j = i - 2; j >= 0; j--) { if (p[j].ed + r < p[i].st) { break; } } dp[i] = max(dp[j] + p[i].val, dp[i - 1]); } }这样的错误在于,子状态的与母状态的联系被搞乱了。
只递归前一个状态的值,无法起到表示当前这个时间间隔取,或者不取的效果。
因为我要往后递归的是两种情况:当前这个时间间隔取,然后往后递归找最大;当前这个时间间隔不取,然后往后递归找最大。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #include <vector> #include <queue> #include <map> #include <climits> #include <cassert> #define LL long long #define lson lo, mi, rt << 1 #define rson mi + 1, hi, rt << 1 | 1 using namespace std; const int maxn = 1e6 + 10; const int inf = 0x3f3f3f3f; const double eps = 1e-9; const double pi = acos(-1.0); const double ee = exp(1.0); struct Node { int st, ed, val; } p[maxn]; bool cmp(Node a, Node b) { return a.st < b.st; } //int dp[1001][3]; int dp[1001]; int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL int n, m, r; while (~scanf("%d%d%d", &n, &m, &r)) { for (int i = 0; i < m; i++) { scanf("%d%d%d", &p[i].st, &p[i].ed, &p[i].val); } sort(p, p + m, cmp); memset(dp, 0, sizeof(dp)); for (int i = 0; i < m; i++) { dp[i] = p[i].val; } int ans = 0; for (int i = 0; i < m; i++) { for (int j = i + 1; j < m; j++) { if (p[i].ed + r <= p[j].st) { dp[j] = max(dp[j], dp[i] + p[j].val); } ans = max(ans, dp[j]); } } printf("%d\n", ans); } return 0; }
相关文章推荐
- 读博分析
- OC - 类目、延展、协议
- java学习06--比较运算符和逻辑运算符
- 【Web探索之旅】第四部分:Web程序员
- Nginx 在windows下配合iis搭建负载均衡过程
- android开发,设置listview的高度无效
- MYSQL远程访问设置
- 解读Cardinality Estimation算法(第三部分:LogLog Counting)
- iOS9适配系列教程
- iOS9适配系列教程
- 【Web探索之旅】第三部分第三课:协议
- AMD Geode GX processor L1 DCache扩容验证方法
- mysql重连,连接丢失:The last packet successfully received from the server
- SIFT算法
- 【学习笔记】【C语言】条件编译
- Android网络编程中关于AsyncHttpClient获取cookie的问题
- #定位系统性能瓶颈# 序言
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
- VS2013使用TeeChart---入门
- 解读Cardinality Estimation算法(第二部分:Linear Counting)