2020.5.2 清北学堂
-
树上 DP
- 一般就是由子节点向根DP
- 遇到类似 “对于每一个点...” 考虑换根DP
- 𝑂(1)O(1) 求 LCALCA预处理 𝑑𝑓𝑛dfn(进入退出各记录一次),采用 ST 表查询区间最小值。
- 基环树 DP
- 单独考虑环
- 断环为链
- 树上背包
- 泛化物品 - 合并
-
状压DP
- “从集合的角度看待 DP”。 我们设计的状态就是一个个无交集的集合,我们要做到的就是设 计出集合之后,能够想到集合之间元素的联系。那么,碰到一道 题目,我们就思考:我们要设计一个什么样的状态集合才能够把 我们要的东西给分好类,即分成若干个集合,而我们分完之后又 要怎么样进行集合之间的转移。
-
常见位运算
-
__builtin_ffs(x)
:返回 x 的最后一位 1 的是从后向前第 几位,比如 7368(110011001000) 返回 4。
__builtin_clz(x)
:返回前导的 0 的个数。__builtin_ctz(x)
:返回后缀 0 的个数。__builtin_popcount(x)
:返回 x 中 1 的个数。__builtin_parity(x)
:返回 x 中 1 个数的奇偶性。
-
状压的目的:消除后效性,需要记录足够多的信息.
-
考虑组合意义简化题目
-
注意,dp多可以考虑用贪心的思想来进行优化。
可以用size来优化树上背包时间复杂度。