状态压缩动态规划
枚举子集
状压DP中相当重要的技巧(虽然后位有FWT,FMT替代,但不是都能代)
for(int i = x; i; i = (i - 1) & x) {
// i 就是 x 的子集
}
题目
P6622 [省选联考 2020 A/B 卷] 信号传递
看数据范围,
但是题目要求的是排列的贡献,直接状压不可行,需要转化为与顺序无关的情况
观察到
关键转换:发现
此时
方程很好推,时间复杂度
考虑
接下来就是空间优化了 link
反思
被djy薄纱了,难受
考试时思路走错了,以为是直接替换
关键在于看到数据范围就朝着状压的方向走,不断尝试消除排列的影响
P3959 [NOIP2017 提高组] 宝藏
读题,一眼看出状态,但发现缺少层数,无法转移
考虑强制限定层数,所有新加点强制对上一层连边,而不是任意层
感性理解该状态转移完全
p.s. 开始考虑强制选定前一个点,发现这样子树状态还要上传,有后效性,没想到是按层转移(悲
P7519 [省选联考 2021 A/B 卷] 滚榜
最朴素方程非常好列,把状态、总和,前一个数,前一个数取的值全部放入方程即可,但是没有穷举+贪心快
重要性质:由于
这说明我们不需要考虑前一个
p.s. 卡常技巧:把大循环的int变为宏会更快
根号分治
做题时,如果遇到与质因数有关的状压DP,考虑根号分治
原理:我们约定大于
这样我们就在
P2150 [NOI2015] 寿司晚宴
朴素方程略
很明显,对于一个大质数
p.s. 注意
P8292 [省选联考 2022] 卡牌
这道题有两种做法:FWT和容斥
题解都说样例提示了正难则反,但是我觉得FWT更自然……
做法1:暴力状压+FWT优化枚举子集
先根号分治,设
对大质数不同的数分开跑
那么最后合并答案
做法2:容斥
看看题目要求的是什么,不要容斥错了
其实第一眼发现
题目求的是质数集至少为
考虑容斥中常见的钦定大法,(不能钦定
我们考虑钦定
此时
考虑大质数时也一样,只不过对于要求选取的大质数必须选一个,即
技巧:如果每次都把大质数的
快速沃尔什变换(FWT)
求解
FWT类似于FFT,是基于反演优化的(FWT更直观一点),实际上就是找一个式子
或卷积
这里找到的式子为
接下来就是高效处理出
转成二进制形式,
还原数组时减回来即可
与卷积
异或卷积
子集卷积
即求
子集反演
当方程
具体地,设
即只能从
此时有容斥:
证明略
P3349 [ZJOI2016]小星星
首先得想到枚举子集,向儿子递归转移,时间复杂度
然后考虑把恰好为
注意这里有个技巧:不需要使得编号对应不重(即树上两个点可能对应图上的同一个点),因为对于答案
C. 拼凑数字
给你
首先得想到朴素状压(逆天,我考时没想到
记
然后想到每个数只能是
通过计算可知,状态数最多为
但是对于非01串的状压,可能需要一点优化
技巧
P3813 [FJOI2017]矩阵填数
常见思路:最大值为
但是在这里有多个矩形,直接做会有问题,因为非法方案应该是存在一个矩形最大值
上公式:
钦定
考虑离散化之后,
时间复杂度
轮廓线
用01序列描述二维矩阵上的凸多边形(即坐标单调)
P4363 [九省联考 2018] 一双木棋 chess
轮廓线DP
注意轮廓线还原为状态的技巧及逆序转移
由于这里求两人价值差,转移时把自己强行当作先手,逆推时对
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效