状压dp1
集合
- 全集:所有数字全选的情况,U表示,U=(1<<m)-1
- 补集:一般成为A的补集=U-A,表示为U^A
- 交集:两个集合共同选择的部分, A&B
- 并集:两个集合所有的选择,A|B
- 空集:一定是左右集合的子集
- 子集:A集合表示一种选择的情况,子集叫做B集合,A集合的子集
- 真子集:不包含A集合本身
A->有S个长->子集数量\(2^S\)
P3092 [USACO13NOV] No Change G & 子集类型状压dp重要内容
总结
1.状态定义
用二进制数表示集合状态,例如 dp[i] 表示状态 i下的最优解。
例如:题目 P3092 中,dp[i] 表示使用硬币集合 i 时能买到的最远物品位置
- 子集枚举与转移
通过j=(j-1)&i循环枚举子集可将复杂度优化到\(O(3^n)\) 避免暴力枚举所有可能的子集
在 P3092 中,每次转移时枚举当前状态 i 的子集 j,并计算添加一个硬币后的扩展范围
3.预处理与优化
- 前缀和+二分:对于需要快速计算连续区间和的问题,预处理前缀和并用二分查找确定硬币能覆盖的最远位置,将复杂度从
- 位运算加速
- 状态转移方程设定
根据问题特性设计转移方程。例如,P3092 的转移方程为:
\(dp[i]^1 = max{二分查找(dp[i / j]+1,硬币j的面值)}\)
\([j{\color{Red} \in }i ]^1\)
5.计算答案
遍历所有状态 i,若 dp[i] = N,则剩余金额为总硬币面值和减去已用硬币面值和,取最大值即可

浙公网安备 33010602011771号