洛谷 P1156 垃圾陷阱 (01背包拓展)(好题!!)
这真是一道好题目
学到了很多
一开始感觉吃或者不吃会有后效性
然后看到洛谷的题解,直接把这个有后效性的部分当作dp的维度和值
因为这个垃圾可以堆或者不堆,所以这个很像01背包,
但是加了非常多的限制条件,是一个升级版的01背包
记住思考01背包问题的时候,要思考i那一维度,最后再考虑要不要用滚动数组
否则会增加思维难度
这里有几个量,是高度,生命,时间
因为时间是固定的,所以可以不理他
然后就是高度和生命谁作维度谁做值
生命没有具体的范围,不好枚举,
所以我们就拿高度为维度,来枚举,范围最大为题目给的d
f[i][j]为前i个物品高度为j的最大生命值
则f[i][j] = max(f[i-1][j] + a[i].v) 这是吃垃圾
f[i][j] = max(f[i-1][j-a[i].h]) 这是堆垃圾
注意前提是之前的状态是存在的,即不死。
如果有存在状态是j >= m(题目给的高度),那么就可以输出当前垃圾的时间
如果没有,就输出max(f[i][0])
然后这里有个非常非常牛逼的技巧,可以简化很多
这里的生命值是忽略时间导致生命值的减少的。(洛谷上说这是离线算法)
但是比较的时候就要和当前时间比。
如果这里生命值是算上时间导致的生命值减少,
那么比较的时候显然和0比。
那么这两者只是比较上有差别,但是如果要计算
时间的减少的话代码会多一些。
01背包一样,可以用滚动数组,把i这一维省掉
然后可以用填表法或者刷表法
其实我自己的思维习惯是填表法,即从前面
的状态推到当前状态。
但是对于这道题,显然刷表法更方便,即用现在的状态
推后来的状态
因为这里有个判断当前状态存不存在的问题
填表法的话因为从两个状态过来,所以要判断两次
但是如果是刷表法的话,只用判断当前的状态是否存在,
后来的状态等到枚举后来的状态自然会判断,只用判断一次。
大家可以自行体会一下两种方法。
填表法
#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 1123;
int f[MAXN], n, m;
struct node
{
int t, v, h;
void read() { scanf("%d%d%d", &t, &v, &h); }
bool operator < (const node& rhs) const
{
return t < rhs.t;
}
}a[MAXN];
int main()
{
scanf("%d%d", &m, &n);
REP(i, 1, n + 1) a[i].read();
sort(a + 1, a + n + 1);
f[0] = 10;
a[0].t = 0;
REP(i, 1, n + 1)
for(int j = m; j >= 0; j--)
{
if(f[j] >= a[i].t)
f[j] = max(f[j], f[j] + a[i].v);
if(j >= a[i].h && f[j-a[i].h] >= a[i].t)
f[j] = max(f[j], f[j-a[i].h]);
if(f[j] >= a[i].t && j == m)
{
printf("%d\n", a[i].t);
return 0;
}
}
printf("%d\n", f[0]);
return 0;
}
刷表法
#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 1123;
int f[MAXN], n, m;
struct node
{
int t, v, h;
void read() { scanf("%d%d%d", &t, &v, &h); }
bool operator < (const node& rhs) const
{
return t < rhs.t;
}
}a[MAXN];
int main()
{
scanf("%d%d", &m, &n);
REP(i, 1, n + 1) a[i].read();
sort(a + 1, a + n + 1);
f[0] = 10;
a[0].t = 0;
REP(i, 1, n + 1)
for(int j = m; j >= 0; j--)
if(f[j] >= a[i].t)
{
if(j + a[i].h >= m)
{
printf("%d\n", a[i].t);
return 0;
}
f[j+a[i].h] = max(f[j+a[i].h], f[j]);
f[j] += a[i].v;
}
printf("%d\n", f[0]);
return 0;
}
总结
(1)01背包的思考方法
(2)状态的离线设计方法
(3)填表法与刷表法的比较
洛谷 P1156 垃圾陷阱 (01背包拓展)(好题!!)的更多相关文章
- 洛谷 P1156 垃圾陷阱
2016-05-31 09:54:03 题目链接 :洛谷 P1156 垃圾陷阱 题目大意: 奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10) 若可以出来,求奶牛 ...
- 洛谷——P1156 垃圾陷阱
P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D ...
- 洛谷P1156 垃圾陷阱 dp
正解:dp 解题报告: 这儿是传送门! 话说最近怎么神仙们都开始狂刷dp,,,感觉今天写了好多dp的题解的样子?(也就三四道其实× 然后这题,首先看到要么吃要么堆起来就会想到01背包趴?然后就考虑设方 ...
- 洛谷 P1156 垃圾陷阱 题解
题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...
- P1060 开心的金明(洛谷,动态规划递推,01背包轻微变形题)
题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里 ...
- 洛谷P1156 垃圾陷阱[背包DP]
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- 洛谷P1156 垃圾陷阱【线性dp】
题目:https://www.luogu.org/problemnew/show/P1156 题意: 每一个垃圾投放时间是t,可以堆的高度是h,如果吃掉可以增加的生命值是f. 给定g个垃圾,初始生命值 ...
- 洛谷P1156 垃圾陷阱
动规仍然是难关啊 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想 ...
- 洛谷 P1156 垃圾陷阱 谈论剪枝,非满分
这是一个91分的非dp代码(是我太弱) 剪枝八五个(实际上根本没那么多,主要是上课装逼,没想到他们dp水过去了),不过我的思路与dp不同: 1.层数到达i+1,return 这个必须有 2.当前剩余生 ...
随机推荐
- 脱离node自己使用普通的requirejs管理js资源
首先,工程目录: 现在主页面(web框架写法.html): <!DOCTYPE html> <html lang="en"> <head> &l ...
- Spannable对textview首行缩进的设置
1.创建Spannable对象 SpannableString contentSpan = new SpannableString(data.getBusinessTitle()); 2.设置文本缩进 ...
- Servlet学习(一)——Servlet的生命周期、执行过程、配置
1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过jav ...
- Oracle查询当前用户下的所有表及sqlplus 设置 列宽
如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密码@IP地址/数据库名称. [oracle@ ...
- EFcore笔记之创建模型
排除属性:NotMapped NotMapped:排除属性在CodeFirst的时候在数据库里不创建该属性 public class Blog { public int BlogId { get; ...
- Visual Studio中C++工程的环境配置方法
在Visual Studio的C++工程设置 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录. 2.添加文件引用的lib静态库路径:工程---属性- ...
- CSS常用样式--font
CSS font 属性 参考:W3school- CSS font 所有浏览器都支持 font 属性,可在一个声明中设置所有字体属性,各属性需按顺序,语法如下: selector{ font:styl ...
- [Vijos P2000]A x B Problem
题目大意:叫你求A × B. 解题思路:高精度.你可千万别小看这道题,这是2017年7月27日的信息. 不过也不要怕,根据twd2的题解里写的,用普通的高精度加上一些小小的修改是可以过的. 那么直接上 ...
- 推荐学习《组织与管理研究的实证方法(第2版)》中文PDF
在写文章论文时,会涉及到观点论证,需要掌握一些实证方法. 建议学习<组织与管理研究的实证方法(第2版)>,对管理研究中涉及的方法进行了介绍,例如实验室研究,二手数据的研究,实地研究等,这对 ...
- 平凡主丛上的Yang-Mills理论
本文是复旦大学由丁青教授的暑期课程“Yang-Mills理论的几何及其应用”所作笔记,会有少许修正. 所需基础: 多元微积分学 微分方程(常微分方程,数学物理方程) 曲线曲面论(初等微分几何) 以下是 ...