博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1156 垃圾陷阱
阅读量:6572 次
发布时间:2019-06-24

本文共 2176 字,大约阅读时间需要 7 分钟。

我是真的不知道。。。

这道题对于每一个垃圾有两个决策:堆放不吃 或者 吃掉不堆放。

终止条件是堆放的高度达到\(d\)。想要求达到状态的最大生命值或者最久能活到多久。

可以联想到背包问题,而且是01背包。

把生命值当做价值,把高度当做重量,我们就可以用最小重量取出最大价值。

\(dp[i][j]\)为前\(i\)个垃圾,已经堆放了高度\(j\)的最大生命值。

递推就可以想普通的填表法搞出来。

这个东西挺奇怪的,奶牛生命值为0的时候还能转移。。。这个注意一下。

如果填表的时候填到\(j==n\)的时候就可以判断是可以出去的,直接return掉。

否则要输出奶牛能活最久多长时间。我们可以利用dp数组,求出的最大生命值加上那一块掉落时间。

注意:在做dp的时候,有的dp是没有状态的,是会死的。这些死的dp值是负数。

所以我们要初始化dp数组为负无穷大。

注意:给你的垃圾顺序可能是乱序的,要按照时间顺序排序。

代码:

#include
#include
#include
const int maxn = 105;const int INF = 0x3f3f3f3f;int d, g;struct Trash{ int tim, t, h;} s[maxn];int dp[maxn][maxn];// 前i件垃圾,堆了高度j的最大生命值 int read(){ int ans = 0, s = 1; char ch = getchar(); while(ch > '9' || ch < '0') { if(ch == '-') s = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar(); return s * ans;}bool cmp(const Trash a, const Trash b){ return a.tim < b.tim;}int main(){ d = read(), g = read(); for(int i = 1; i <= g; i++) { s[i].tim = read(), s[i].t = read(), s[i].h = read(); } for(int i = 0; i <= g; i++) for(int j = 0; j <= d; j++) dp[i][j] = -INF; std::sort(s + 1, s + g + 1, cmp); dp[0][0] = 10; for(int i = 1; i <= g; i++) { for(int j = 0; j <= d; j++) { if(dp[i - 1][j] - (s[i].tim - s[i - 1].tim) >= 0)// 没被饿死 { dp[i][j] = std::max(dp[i][j], dp[i - 1][j] - (s[i].tim - s[i - 1].tim) + s[i].t); } if(dp[i - 1][j - s[i].h] - (s[i].tim - s[i - 1].tim) >= 0 && j - s[i].h >= 0)// 没被饿死,并且能转移 { dp[i][j] = std::max(dp[i][j], dp[i - 1][j - s[i].h] - (s[i].tim - s[i - 1].tim)); if(j == d) { printf("%d\n", s[i].tim); return 0; } } } } int ans = -INF; for(int i = 1; i <= g; i++) { for(int j = 0; j <= d; j++) { if(dp[i][j] < 0) continue; ans = std::max(ans, dp[i][j] + s[i].tim); } } printf("%d\n", ans); return 0;}

转载于:https://www.cnblogs.com/Garen-Wang/p/9658038.html

你可能感兴趣的文章
Web 前端开发者必知CSS 属性
查看>>
LeetCode 391: Perfect Square
查看>>
数据库比对脚本(PHP版)
查看>>
zabbix系列(四)Zabbix3.0.4添加对Nginx服务的监控
查看>>
ADO.NET笔记——SQL注入攻击
查看>>
Redis入门学习
查看>>
kali linux 2.0安装sublime text 2
查看>>
Leetcode题目:Palindrome Linked List
查看>>
字节跳动2018校招测试开发方向(第二批)
查看>>
C++:关于初始化C++类成员的一些问题
查看>>
使用jQuery封装实用函数
查看>>
导出excel
查看>>
字符串拼接 + 和 join
查看>>
盒模型
查看>>
Luogu P3168 [CQOI2015]任务查询系统
查看>>
spring入门
查看>>
a标签,img标签,表格
查看>>
Appium Server 传递Android参数
查看>>
阅读计划
查看>>
【Spark篇】---Spark中控制算子
查看>>