PrepStack · Markdown HTML

状态压缩 DP

位运算与位掩码状态 · HTML

数学 / 逻辑形态

dp[mask] 表示恰完成集合 mask 后的最优值;转移添加 i:next=mask|(1<<i),或从 mask 删除最后元素。

识别信号

容易误判的相似信号

SignalWhy it is different
未来还依赖未编码历史若最后位置、资源量等影响转移,必须加入额外维度。
n 太大2^n 状态本身不可行,需结构优化或不同算法。

核心不变量

dp[mask] 是所有恰形成 mask 的合法序列中最优者;只从已正确的较小状态转移。

状态、转移与处理顺序

ItemDefinition
State长度 2^n 的 dp;必要时加 last、remaining 等最小充分维度。
Transition枚举未选 i,从 dp[mask] 加 transition_cost(mask,i) 松弛 dp[mask|1<<i]。
Frontier / order按 bit_count 递增处理集合;所有前驱少一个元素,天然形成 DAG。

Python 骨架

def min_order_cost(n, step_cost):
    inf = float('inf')
    dp = [inf] * (1 << n)
    dp[0] = 0
    for mask in range(1 << n):
        if dp[mask] == inf: continue
        for i in range(n):
            if mask >> i & 1: continue
            nxt = mask | (1 << i)
            dp[nxt] = min(dp[nxt], dp[mask] + step_cost(mask, i))
    return dp[-1]

正确性思路

  1. 空集合基例最优。
  2. 任何非空方案都有一个最后加入元素 i,删除它得到严格更小前驱。
  3. 枚举全部前驱与最后选择覆盖所有合法方案。
  4. 取 min 保留同一 mask 的最优路径,归纳得到最终最优。

复杂度

TimeSpaceParameters
典型 O(n2^n),带 last 可能 O(n²2^n)O(2^n) 或 O(n2^n)n 为可选择元素数

边界条件

错误模式

PatternWhy it fails / fix
状态信息不足同一 mask 的不同 last 若未来不同就不能合并。
重复选择元素转移前必须检查对应位未设置。
无穷值继续运算跳过不可达状态以免污染或溢出。

选择与排除规则

相关模板

RelationTemplateBoundary
aggregation-alternative约束满足回溯只求最优/计数且已用集合足以定义状态。
alternative0/1 / 完全背包 DP物品数小而容量巨大,集合状态更紧凑。
aggregation-alternative排列回溯只求遍历/匹配集合的最优值而非列出排列。
一般化有限状态机 DP状态不是纯集合而是有限自动机
搜索替代子集 / 组合回溯强剪枝可避开多数 mask

原创微型例子

环节内容
Result8 个 mask 复用所有到达同一集合的顺序。
Scenario三项任务,每项成本依赖此前已做集合。
Walkthrough例如 011 可由 001 加任务 1 或 010 加任务 0,dp[011] 保留更小成本。

Recall prompts

我的补充