一、什么是状态压缩 DP
Mermaid · 渲染中(下方为源码)
graph LR A[集合选取状态] --> B[二进制位表示] B --> C[整数即状态] C --> D[位运算转移]
状态压缩 DP(Bitmask DP) 用一个整数的二进制位表示一组元素的选取状态,从而将集合问题转化为 DP。
适用条件:元素个数 n 很小(通常 n ≤ 20),因为状态数为 2ⁿ。
| n | 状态数 2ⁿ | 可行性 |
|---|---|---|
| 10 | 1024 | 轻松 |
| 15 | 32768 | 可行 |
| 20 | 1048576 | 勉强 |
| 25 | 33M | 太慢 |
二、位运算基础
int mask = 0;
mask |= (1 << i); // 选第 i 个
mask &= ~(1 << i); // 去掉第 i 个
boolean has = (mask & (1 << i)) != 0; // 第 i 个是否被选
int count = Integer.bitCount(mask); // 选了几个