洛谷P1156 垃圾陷阱【线性dp】
题目:https://www.luogu.org/problemnew/show/P1156
题意:
每一个垃圾投放时间是t,可以堆的高度是h,如果吃掉可以增加的生命值是f。
给定g个垃圾,初始生命值是10,要求如果要爬出深度为d的井的最早时间是多少。如果爬不出去,最多的生存时间是多少。
思路:
有几个状态,时间,高度,生命值,第几个垃圾。
时间显然是垃圾投入时就马上进行处理,所以这个应该不会是一维状态。
而一个垃圾只有两种状态,堆起来或者是吃掉,看起来就很像背包。
于是刚开始考虑的是用dp[i][j]表示处理前i个垃圾,剩余生命力是j的时候的最大高度。
但是这样j的取值范围并不是很好确定。
那么考虑用dp[i][j]表示处理前i个垃圾,当前高度是j时的最大生命力。
转移方程:dp[i][j] = max(dp[i-1][j-trash[i].h], dp[i-1][j]+trash[i].f)
要注意判断这个状态是不是可达的,也就是说生命力值是否超过了垃圾投入时间。
然后扫一遍得到答案。
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr; int d, n;
const int maxn = ;
struct node{
int t, f, h;
}trash[maxn];
int dp[maxn][]; bool cmp(node a, node b)
{
return a.t < b.t;
} int main()
{
scanf("%d%d", &d, &n);
for(int i = ; i <= n; i++){
scanf("%d%d%d", &trash[i].t, &trash[i].f, &trash[i].h);
}
sort(trash + , trash + + n, cmp);
//memset(dp, -1, sizeof(dp));
dp[][] = ; int ans = , mxtime;
for(int i = ; i <= n; i++){
for(int j = ; j <= d; j++){
//if(dp[i][j] < 0)continue;
if(dp[i - ][j] >= trash[i].t)dp[i][j] = max(dp[i][j], dp[i - ][j] + trash[i].f);
if(j >= trash[i].h && dp[i - ][j - trash[i].h] >= trash[i].t) dp[i][j] = max(dp[i - ][j - trash[i].h], dp[i][j]);
//mxtime = max(dp[i][j], mxtime);
} }
int maxh=, maxt=;
int i;
for(i=;i<=n;i++)
{
for(int j=;j<=d;j++)
{
if(dp[i][j]-trash[i].t>=)
maxh=max(maxh,j);
maxt=max(maxt,dp[i][j]);
}
if(maxh==d)
break;
}
if(maxh==d)
cout<<trash[i].t<<endl;
else
cout<<maxt<<endl; return ;
}
洛谷P1156 垃圾陷阱【线性dp】的更多相关文章
- 洛谷P1156 垃圾陷阱[背包DP]
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- 洛谷 P1156 垃圾陷阱
2016-05-31 09:54:03 题目链接 :洛谷 P1156 垃圾陷阱 题目大意: 奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10) 若可以出来,求奶牛 ...
- 洛谷——P1156 垃圾陷阱
P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D ...
- 洛谷 P1156 垃圾陷阱 (01背包拓展)(好题!!)
这真是一道好题目 学到了很多 一开始感觉吃或者不吃会有后效性 然后看到洛谷的题解,直接把这个有后效性的部分当作dp的维度和值 因为这个垃圾可以堆或者不堆,所以这个很像01背包, 但是加了非常多的限制条 ...
- 洛谷P1156 垃圾陷阱 dp
正解:dp 解题报告: 这儿是传送门! 话说最近怎么神仙们都开始狂刷dp,,,感觉今天写了好多dp的题解的样子?(也就三四道其实× 然后这题,首先看到要么吃要么堆起来就会想到01背包趴?然后就考虑设方 ...
- 洛谷P1156 垃圾陷阱
动规仍然是难关啊 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想 ...
- 洛谷 P1156 垃圾陷阱 谈论剪枝,非满分
这是一个91分的非dp代码(是我太弱) 剪枝八五个(实际上根本没那么多,主要是上课装逼,没想到他们dp水过去了),不过我的思路与dp不同: 1.层数到达i+1,return 这个必须有 2.当前剩余生 ...
- 洛谷 P1156 垃圾陷阱 题解
题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...
- [洛谷1156]垃圾陷阱(DP)
[Luogu1156] f[i]表示高度为i时的存活时间 Code #include <cstdio> #include <algorithm> #define N 110 u ...
随机推荐
- poj2406(求字符串的周期,kmp算法next数组的应用)
题目链接:https://vjudge.net/problem/POJ-2406 题意:求出给定字符串的周期,和poj1961类似. 思路:直接利用next数组的定义即可,当没有周期时,周期即为1. ...
- java学习(东软睿道)2019-09-07(预课html基础)《随堂笔记》
1. 文件名称.html 2. 后缀表示文件类型.txt .doc .ppt 3. 标签<html> <head> <body> 显示内容 <font siz ...
- @RequestBody以及@RequestParam的使用过程区别
查考地址:https://blog.csdn.net/justry_deng/article/details/80972817 待整理中.....
- springboot @vaule注解失效解决办法
在Controller类里面通过@Value将参数注入进来,最后的确成功了.因此基于此经验,我便在其他使用的类里面也采用这样的方式注入参数,但是发现去失效了,报错为NULL,说明参数并没有我们料想的被 ...
- Ural 1201 Which Day Is It? 题解
目录 Ural 1201 Which Day Is It? 题解 题意 输入 输出 题解 程序 Ural 1201 Which Day Is It? 题解 题意 打印一个月历. 输入 输入日\((1\ ...
- 超简单的js实现提示效果弹出以及延迟隐藏的功能
自动登录勾选提示效果 要求:鼠标移入显示提示信息框:鼠标离开,信息框消失,消失的效果延迟 <!DOCTYPE html> <html lang="en"> ...
- 面试官:Kafka 如何优化内存缓冲机制造成的频繁 GC 问题?
Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response 都是以 长度+内容 形式描述, 见于 A Guide To The Ka ...
- 简单分析BeanPostProcessor
1. 什么是BeanPostProcessorBeanPostProcessor是一个接口,有两个方法,分别是:Object postProcessBeforeInitialization(Objec ...
- 客户端相关知识学习(九)之h5给app传递数据
方法一: 情况一: if (window.JdAndroid){ window.JdAndroid.setPayCompleted(); window.JdAndr ...
- javaIO——LineNumberReader
LineNumberReader 是java字符流中的一员,它继承自 BufferedReader,只是在 BufferedReader 基础上,提供了对当前流位置所在文本行的标记记录.先来看看定义: ...