状压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 时能买到的最远物品位置

  1. 子集枚举与转移
    通过 j=(j-1)&i 循环枚举子集可将复杂度优化到\(O(3^n)\) 避免暴力枚举所有可能的子集

在 P3092 中,每次转移时枚举当前状态 i 的子集 j,并计算添加一个硬币后的扩展范围

3.预处理与优化

  • 前缀和+二分:对于需要快速计算连续区间和的问题,预处理前缀和并用二分查找确定硬币能覆盖的最远位置,将复杂度从
  • 位运算加速
  1. 状态转移方程设定
    根据问题特性设计转移方程。例如,P3092 的转移方程为:
    \(dp[i]^1 = max{二分查找(dp[i / j]+1,硬币j的面值)}\)
    \([j{\color{Red} \in }i ]^1\)

5.计算答案
遍历所有状态 i,若 dp[i] = N,则剩余金额为总硬币面值和减去已用硬币面值和,取最大值即可

P5911 [POI 2004] PRZ

posted @ 2025-08-01 14:51  wmq2012  阅读(16)  评论(0)    收藏  举报