【笔记】Tricks - 动态规划 DP
Ordinary
- 2024/4/21 对于状态转移比较复杂的 DP,可以考虑记忆化搜索。【[ABC350E] Toward 0】
- 2024/5/2 如果 dp 状态数比较多,可以考虑减少状态(离散化)然后降低复杂度【NOIP模拟赛8 六出祁山】
- 2024/5/2 如果 dp 转移有环,一般有如下三种处理方法:【NOIP模拟赛8 威震逍遥津】
- 如果状态是求极值,可以考虑类 dijkstra 转移;
- 把有环的部分单独处理(用 Floyd 预处理),然后在之后的转移中忽略这些转移,即可;
- 将朴素的有环的 dp 跑若干遍即可。
正确性的证明可以考虑转移边和状态实际上构成图,转移的过程就是跑最短路,上述的过程可以看成是 SPFA 算法。
- 2024/11/8 dp 转移的时候需要满足一些条件?那就在状态里面做手脚【「NOIP2024模拟赛24 T2」子序列们】
1 计数
- 2024/11/19 考虑 对称性,i.e. 某个因素的改变可能不会影响方案数(方案数相同)【「CF967E1」Deterministic Heap (Easy Version)】
2 状压
-
2024/5/17 给定一个无向图,问最少可以用多少种颜色将所有点染色,使得每条边两侧颜色不同。【[ARC171D] Rolling Hash】【独占访问2 Exclusive Access 2】
设 \(f_S\) 表示将点集 \(S\) 的导出子图按以上规则染色,需要的最少颜色数。设 \(g(S)\) 表示点集 \(S\) 是否为独立集。有转移:\[f_{S}=\left\{\begin{array}{ll} 0, & S=\varnothing \\ \min _{T \subseteq S \wedge g(T)}\left\{f_{S \backslash T}+1\right\}, & S \neq \varnothing \end{array}\right. \]可以在 \(O(3^n)\) 的时间复杂度内枚举子集实现。(
U为全集,T为枚举的S的子集for (int S = 0; S < U; S++) for (int T = S; T; T = (T-1) & S) ...
3 位运算相关
3.1 异或
- 2024/5/18 一般在处理异或运算发现不好转移的时候我们都会想到拆位。并且这个拆位时常是在与当前转移有关的部分的。比如后面这个题里面的当前连通块内的【「KDOI-06-S」树上异或 】【好题解】

浙公网安备 33010602011771号