洛谷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 ...
随机推荐
- poj3107(树的重心,树形dp)
题目链接:https://vjudge.net/problem/POJ-3107 题意:求树的可能的重心,升序输出. 思路:因为学树形dp之前学过点分治了,而点分治的前提是求树的重心,所以这题就简单水 ...
- 聊聊BIO、NIO与AIO的区别
题目:说一下BIO/AIO/NIO 有什么区别?及异步模式的用途和意义? 1F 说一说I/O首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同 ...
- 剑指offer42:数组和一个数字S,输出两个数的乘积最小的
1 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. ...
- Thinkphp自定义生成缩略图尺寸的方法
Thinkphp自定义生成缩略图尺寸的方法,本实例中生成两张不同尺寸的图片:第一张是大图350*350,第二张 50*50的缩略图 Image类是Thinkphp系统自带的,可以研究下,这个缩略图类很 ...
- multipart/form-data(二进制流) 两种传输方式
一.传统表单提交传输方式 <form id= "uploadForm" action= "url" method= "post" en ...
- SHE姐妹建模记录
中午11点54分,队长把MD5码提交上去在群里发了截图,我对着屏幕上刚检查完的论文,感觉整个人都轻松起来了,又有点恍惚,可能是这几天都没睡好觉.去楼下吃了顿饭,本来打算回来倒头就睡,睡到几点算几点,醒 ...
- 【Trie】Nikitosh 和异或
[参考博客]: LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie [题目链接]: https://loj.ac/problem/10051 [题意]: 找出两个不相交区 ...
- spring——自动装配
语法:<bean id="..." class="..." autowire="byType"/> autowire属性取值如下 ...
- javascript——onsubmit和onreset事件 和开发中常用的方式
<head> <meta charset="UTF-8"> <title></title> <script> funct ...
- EFcore的 基础理解<二> shadow 特性
接着上一篇.在MyEFTestContext 类中添加这个方法 protected override void OnModelCreating(ModelBuilder modelBuilder) { ...