DP笔记
DP
by xiaruize
跟着 Troverld 刷的一些 题
P4046 [JSOI2010] 快递服务
朴素的 状态是 dp[i][j][k][p]
表示考虑到第 个需求,三个货车分别在 的最小代价
发现其实必然有一个货车在 上,所以 dp
可以去掉一维
即 dp[i][j][k]
表示考虑到第 个需求,除了在 上的货车,剩下两个在 的最小代价
状态数为 转移是线性的 空间可以把第一维滚动
P2518 [HAOI2010] 计数
枚举前面几位是一样的,再枚举第一位不一样的填几,后面的直接组合算
感觉不是很有 dp
P4158 [SCOI2009] 粉刷匠
dp[i][j][k][0/1]
表示到 用了 次操作,当前颜色是否正确 下的最优解
转移只需要关心前一个格子的颜色(需要特判每一行的开头)
时间复杂度
P4302 [SCOI2003] 字符串折叠
明显的区间dp题,转移只需要对因子判断循环即可,时间复杂度是
P4290 [HAOI2008] 玩具取名
状压 考虑``dp[i][j]=msk` 表示 可以转换到的字母 转移即可
P2167 [SDOI2009] Bill的挑战
dp[i][msk]
表示到第 位,当前匹配的状态为 的方案数
暴力比较转移会 TLE
可以考虑预处理一个 pre[i][j]
表示第 位放 这个字母能匹配的串的状态
这样时间复杂度就是 , 其中 为最长的串的长度
CF149D Coloring Brackets
dp[l][r][0/1/2][0/1/2]
表示当前区间为 是一个完整的括号序列,左侧染色的状态 右侧染色的状态 下的方案数
转移考虑两种
- 当 是一对在原序列中匹配的括号时,计算
- 否则递归计算
合并可以直接枚举
P4448 [AHOI2018初中组] 球球的排列
妙妙题啊 两个部分都挺智慧的!
Part 1
首先,发现当 满足 为平方数,且 也满足时, 一定也满足
即可以将原序列分为几组数,每一组都两两相乘为平方数,且不同组两两相乘一定不为平方数
于是问题转化为:
给定一个由几种颜色组成的序列 ,同色有区别,求同样颜色不相邻的排列数
Part 2
考虑怎么求解上面的问题,可以先将原数组按颜色排序
考虑如下 dp
状态
dp[i][j][k]
表示当前考虑到第 个数,前面有 对相邻的同色且与 不同, 对同色且与 相同
转移分类讨论
-
此时第三维一定为
-
将当前球放在两个不同色之间
-
将当前球放在两个同色之间
-
-
令 表示到 与 相同的个数
-
放在同色球旁边
-
放在两个颜色相同的球中间
-
放在两个颜色不同且与当前不同的球之间
-
答案为 dp[n][0][0]
时间复杂度为
P2476 [SCOI2008] 着色方案
上题双倍经验,乘一下阶乘逆元
P2160 [SHOI2007] 书柜的尺寸
第很多次做到这个题了 老套路了
首先对于书按照 排递减序,这样每层第一个选择就可以确定这一层的高度
暴力 dp
是 dp[i][j][k][l]
表示考虑到第 本书,三层宽度分别为 时最小的高度
发现 知二求一,故把 这一维去掉,变成 dp[i][j][k]
时间复杂度
P2365 任务安排
斜率优化板子题
P5785 [SDOI2012] 任务安排
斜率优化板子题
P3299 [SDOI2013] 保护出题人
其实是求
可以把这个东西拆成斜率的形式
即 和 的斜率
单调栈维护这个东西 对于每次查询 在单调栈上二分即可
P4056 [JSOI2009] 火星藏宝图
将点先排序, 优先,否则
此时,注意到按顺序,每个点都可以由他前面的所有 小于当前点的点转移过来
观察性质,发现在所有 一样的点中,从 尽可能大的点转移一定是不劣的,所以可以维护一个数组存每个 最大的
时间复杂度
有点卡常,但是可以吸氧通过
P2593 [ZJOI2006] 超级麻将
和上面的一个很类似
dp[i][j][k][0/1]
表示考虑到 , 选了 个 , 个 ,当前是否有对 是否可能
转移分讨即可
P2581 [ZJOI2005] Genotype
和上面一题差不多 状压维护每一段可以合成的字母
多了一个 计算 这个区间最小的原序列长度就行
P2317 [HNOI2005] 星际贸易
题目分为两个部分
第一部分是背包板子
第二部分
令 dp[i][j]
表示到 这个位置,有 份燃料的最小代价
注意到后一半可以直接转移,而前一半可以单调队列维护
P2523 [HAOI2011] Problem c
多测要清零
显然编号并不影响答案,其实是要满足这样一个式子
于是可以处理处
令 dp[i][j]
表示从后往前, 考虑到第 位, 还有 个没有确定的方案数
注意取模后最后 也有可能为 , 要单独判断是否转移过
P3830 [SHOI2012] 随机树
对于第一个询问,每个新增的点对答案的贡献为
第二个询问 设 dp[i][j]
表示 个点,深度大于等于 的概率
可以发现上面是个容斥,表示至少有一边深度大于等于 的概率,分母上的 是因为无论原来怎么放,新加入一个点的方案数是一样的,概率也是一样的
P2466 [SDOI2008] Sue 的小球
经过必然会收集,这样一定是最优的
所以一定是一段连续的区间,考虑区间
dp[i][j][0/1]
表示当前考虑区间 ,当前在左/右端点,最小的损耗是多少
转移是 的,只有可能从 这两个区间转移
P2462 [SDOI2007] 游戏
考虑建图,对于每个串暴力枚举加入的字母,排序用 map
查一下即可
拓扑序上直接 dp
P4460 [CQOI2018] 解锁屏幕
考虑状压 枚举子集是 不能通过
发现转移的时候判断是否可行可以预处理,即枚举 , 预处理出要使得 需要哪些已经被选中
这样就可以 的转移,时间复杂度
p.s. 不会计算几何qwq
P4728 [HNOI2009] 双递增序列
dp[i][j]
表示考虑到第 个数,当前两个序列,一个以 结尾,另一个以长度为 最后一个数最小为
转移考虑两种情况 和
P4495 [HAOI2018] 奇怪的背包
用了点数学,不会证明qwq
对于每个 发现能表示的数和 是一样的, 所以可以直接把 换成 ,不会影响答案
考虑选了多个,其能覆盖的重量为 的倍数
可以预处理 的所有约数,在约数上
设 dp[i][j]
表示考虑到第 个约数,当前的 等于第 个约数的方案数
其中, 表示 的第 个约数, 表示第 个约数在 中出现的次数
最后答案为 ,
发现 在这个查询中等价于 所以可以对于 的约数预处理答案,这样查询就是 的
P6239 [JXOI2012] 奇怪的道路
看到 的范围,不难想到对其状压,一个直观的 状态为
dp[i][j][msk]
表示考虑前 个点,连了 条边,最后 个点的连边奇偶数状态为 的方案数
P4574 [CQOI2013] 二进制A+B
dp[i][j][k][p][0/1]
表示考虑到第 位, 分别用了 个 , 当前位是否进位下, 的最小值
暴力转移即可
最后判 注意特判
[IOI2005] Riv 河流
第一眼的 状态为 dp[i][j]
表示以 为根的子树建立 个的最小代价,但是发现并不好转移,因为最近的厂在哪是不确定的
于是更改 状态为 dp[i][j][k]
表示以 为根的子树,最近的有厂的祖先是 (不包括 自身), 建了 个厂的最小代价
转移需要先分类讨论当前点上是否有建厂 然后需要将贡献都统计到 中
具体的,就是在每一个点做背包 ,然后将当前是否建厂的结果取 并加上当前点到最近祖先的代价
CF1067A Array Without Local Maximums
第一眼想法:
dp[i][j][0/1]
表示考虑到 , , 的方案数
但是发现这个状态不方便转移,因为没法处理 的情况,所以考虑改变 状态,将最后一位改成 [0/1/2]
分别表示 的方案数,转移可以前缀和优化做到
最终时间复杂度为
Connecting Vertices
dp[i][j][0/1]
表示 这个区间, 到 强制连边/强制不连边的方案数
CF1088E Ehab and a component choosing problem
分成两部分做 先求最大值
最大值一定可以只选一块 所以可以 dp[x]
表示 的子树中,强制选择 下的最大值
然后可以再做一次同样的 , 在每次值为最大值时将 清零,
P4362 [NOI2002] 贪吃的九头龙
dp[i][j][0/1]
表示当前在 点,子树内有 个是大头吃的, 当前点是不是大头吃的
转移要对 和 分讨
CF906C Party
dp[msk]
表示这些人互相认识的最小代价,转移直接暴力即可,记录前缀输出方案
CF11D A Simple Task
考虑环一定由一条路经和一个回到起点的边组成
dp[msk][i]
表示路经包括 msk
里的点,并且终点在 i
的方案数,每次转移考虑将终点向后移,不可以回到当前的起点(lowbit(msk))之前
再枚举当前终点时判一下能不能回到起点即可
CF24D Broken robot
保留 位小数!
所以可以暴力执行 次普通 ,这样误差较小,即可通过
Dead Ends
考虑状压
dp[msk][s]
表示当前连接了 msk
里的点,其中 s
中的点是叶子结点的方案数
采用刷表法,每次拿一个点向后转移之前,要先将当前点的 值除以叶子个数,因为会有重复转移
P2750 [USACO5.5] 贰五语言Two Five
正序考虑每个数 dp[a][b][c][d][e]
表示5行每行分别填了 个数的方案数
当 时满足题意 可以记忆化搜索
CF261D Maxim and Increasing Subsequenc
注意到,答案的上线是 中不同元素的个数,且当这个个数 必然可以取到
剩下考虑对 离散化,然后暴力转移即可,时间复杂度是 级别的
P4766 [CERC2014] Outer space invaders
对于端点离散化, dp[l][r]
表示搞定所有被区间 完全包含的最小代价
每次,对于一个区间,最后一次操作一定可以等于这个区间中的距离最大值,所以可以确定最后消灭的是哪个
在这个的限制下枚举端点,区间 dp
即可
CF730J Bottles
第一问显然贪心
第二问 dp[i][j]
表示选了 个,当前的容量和为 时,选定的瓶子里已有液体的最大值
暴力转移即可,时间复杂度
本文作者:xiaruize's Blog
本文链接:https://www.cnblogs.com/xiaruize/p/17793228.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步