[luoguP1156] 垃圾陷阱(DP)
2017-06-22 10:51
260 查看
先按照时间排序
f[i][j] 表示 前i个物品高度为j时所剩余的最大能量
显然每个物品有堆和吃两种选择
状态转移看代码
代码
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1001 #define max(x, y) ((x) > (y) ? (x) : (y)) int d, g, ans; int f ; struct node { int t, x, y; }p ; inline int read() { int x = 0, f = 1; char ch = getchar(); for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; return x * f; } inline bool cmp(node x, node y) { return x.t < y.t; } int main() { int i, j; d = read(); g = read(); for(i = 1; i <= g; i++) { p[i].t = read(); p[i].x = read(); p[i].y = read(); } std::sort(p + 1, p + g + 1, cmp); memset(f, -1, sizeof(f)); f[0][0] = 10; for(i = 1; i <= g; i++) for(j = 0; j <= d; j++) { if(f[i - 1][j] >= p[i].t - p[i - 1].t) f[i][j] = max(f[i][j], f[i - 1][j] + p[i].x - (p[i].t - p[i - 1].t)); if(f[i - 1][j - p[i].y] >= p[i].t - p[i - 1].t && j >= p[i].y) { f[i][j] = max(f[i][j], f[i - 1][j - p[i].y] - (p[i].t - p[i - 1].t)); if(j == d) { printf("%d\n", p[i].t); return 0; } } } for(i = 1; i <= g; i++) for(j = 0; j <= d; j++) if(f[i][j] ^ -1) ans = max(ans, f[i][j] + p[i].t); printf("%d\n", ans); return 0; }
相关文章推荐
- Luogu P1156 垃圾陷阱 【dp】By cellur925
- 垃圾陷阱 洛谷1156 dp
- [luogu1156]垃圾陷阱_动态规划_背包dp
- 洛谷1156 垃圾陷阱 dp
- 【动态规划】[luoguP1156]垃圾陷阱
- 洛谷1156垃圾陷阱
- [洛谷1156]垃圾陷阱
- [DP]垃圾陷阱
- 【DP】洛谷 P1156 垃圾陷阱
- 洛谷1156 垃圾陷阱
- 洛谷1156 垃圾陷阱
- SSL 1673_垃圾陷阱_dp
- P1156 垃圾陷阱(dp)有待理解
- Luogu P1156 垃圾陷阱___dp
- 洛谷1156 垃圾陷阱(背包动规)
- SSL1673 垃圾陷阱(dp)
- 辣鸡陷阱_洛谷1156_dp
- 洛谷P1156 垃圾陷阱[背包DP]
- 洛谷1156 垃圾陷阱
- 洛谷P1156 垃圾陷阱(DP,0-1背包)