【笔记】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 计数


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」树上异或 】【好题解
posted @ 2024-04-21 00:05  CloudWings  阅读(44)  评论(0)    收藏  举报