基础dp例题整理
背包:
消失之物
先直接做一遍,必然对于i,有
for(j=m;j>=w[i];--j)
f[i]+=f[i-w[i]]
所以,如果排除用i做背包的结果,减去这个转移就好了。
memcpy(g,f,sizeof f)
for(j=w[i];j<=m;++j)
g[j]-=g[j-w[i]]
关于i的一行就都有了。
[POI2012]SZA-Cloakroom
又是一个有三个属性的题。
肯定要离线。询问关于m排序,物品按照a排序。
k比较小,n比较小。
f[i]表示,决策到当前这个a为止,凑成和为i的所有方案中,最小的b最大是多少。(为了保证bi>m+s)
这样,每到一个决策点m,就可以利用当前处理的f[k]>m+s即可判断能否实现。
因为保证的是最小的b最大是多少。正确性显然。
怎么处理的三个属性呢?a当做顺序,c当做状态,b当做数值。再加上离线对m排序。然后求最小的b最大是多少,直接把配凑问题转化成判定问题。
复杂度O(1e8)可过。
[HNOI2007]梦幻岛宝珠
bzoj1190 [HNOI2007]梦幻岛宝珠 ( 二进制分组优化背包DP)
分层DP。以b为层。
f[i][j]表示,小于等于j*2^i+(w&(1<<(i-1))的最大价值。
每层就是一个0/1背包。
然后考虑逐层合并出来真正的f[i][j]
从低位往高位合并。
f[i][j]=max(f[i][j],f[i][j-k]+f[i-1][min(1000,2*k+((w>>(i-1))&1)]
意义是:把j拆出来k位,用i-1两倍的k来凑出来,然后为了保证+(w&(1<<(i-1))这个东西,就要保证i-1必要时提供一个1*2^(i-1)
至于对1000取min,是可以的。因为本身就不可能达到,而本身就是一个前缀min,这样找不可能超出。
至于那一步加法也是可以的,f[i][j-k]还只是当前层的,就相当于把当前层取出来一些,再把低位的一些取出来拼凑。
至于f[i][j]弄出来前缀的特点,就不要把f[i][j]初值-inf即可。
具体代码见上面的博客(虽然有错)
树形dp
[SCOI2015]小凸玩密室
厉害的树形dp。
神奇的状态设计。
一些需要考虑的细节。
由于起点不定,所以,填法有两种:
1.填完这个子树后,点某个祖先。
2.填完这个子树后,点某个祖先的兄弟。
dp[i][j][0/1]表示,填完以i为根的子树,再取点第j个祖先/第j个祖先的兄弟的代价。
每个点只能在被点到的时候统计贡献,因为这样才能知道距离。nlogn
其实就是一个对未来的承诺。
因为我们不知道填完这个上一个是哪一个,就不能统计贡献。
所以,干脆,就在填完这个之后,直接枚举下一个是哪一个,然后就把贡献算上即可。真在那里填的话,贡献就已经算好了。
而且,祖先只有logn个,下一个填哪一个的方案数比较少。
然后要处理答案。
发现,当起点固定的话,必然要先点完整个子树,然后点父亲,点兄弟子树,再点爷爷,点叔叔子树。
所以,一路模拟即可。
处理答案的复杂度:nlogn
https://blog.chenqiqian.com/20180608-SCOI2015-room/
基础dp例题整理的更多相关文章
- 基础dp
队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...
- 基础DP(初级版)
本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...
- SVG.js 基础图形绘制整理(二)
一.折线 var draw = SVG('svg1').size(300, 300); //画折线 //使用字符串点 // var polyline=draw.polyline('0,0 100,50 ...
- hdu 5586 Sum 基础dp
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...
- hdu 4055 Number String (基础dp)
Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- M - 基础DP
M - 基础DP Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descriptio ...
随机推荐
- hdu1217Arbitrage(floyd+map)
Arbitrage Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 微信小程序—day04
元素水平+垂直居中 昨天的用户页的用户头像,是根据已知的像素大小,设置固定的值,达到居中的效果. 今日切换机型进行适配,发现对不同尺寸大小的屏幕不匹配.所以对wxss进行修改,真正达到水平+垂直居中. ...
- Java开发工程师(Web方向) - 03.数据库开发 - 期末考试
期末考试 编程题 本编程题包含4个小题,覆盖知识点从基础的JDBC.连接池到MyBatis. 1(10分) 有一款在线教育产品“天天向上”主要实现了在手机上查看课程表的功能.该产品的后端系统有一张保存 ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第4章.事务
第4章--事务 事务原理与开发 事务Transaction: 什么是事务? 事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,且逻辑工作单元需满足ACID特性. i.e. 银行转账:开 ...
- 基于 CPython 解释器,为你深度解析为什么Python中整型不会溢出
前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数.在python3后, ...
- [CodeForce431C]k-tree
Quite recently a creative student Lesha had a lecture on trees. After the lecture Lesha was inspired ...
- 【system.number】使用说明
对象:system.number 说明:提供一系列针对数值类型的操作 目录: 方法 返回 说明 system.number.isNumber( number ) [True | False] 检测是否 ...
- solidity中的memory和 storage详解
Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上.这里我会讲解一下关键字storage和memory的区别. storage的结构是在合约部署创建时,根据你的合约中状 ...
- JAVA集合类(大公司面试喜欢问的)
分类: 核心JAVA(11) 版权声明:本文为博主原创文章,未经博主允许不得转载. 看了一些所谓大公司的Java面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少 ...
- jdk1.8新特性-Lambda表达式使用要点
前言 在jdk1.8出来的时候看到过,没怎么了解.但是最近再看kafka和spark框架,框架示例中ava版的很多地方用到Lambda表达式,发现使用Lambda表达式代码确实简单了好多,有些例子大致 ...