动态规划进阶?
树形 dp
P1352 没有上司的舞会 经典的节点选择型。
树形 dp,就是把 dp 建立于树的形态之上,通常 \(dp_i\) 都是 \(i\) 及 \(i\) 的子树范围内的最优化属性。
大致可以分类为节点选择型和树上背包型,还有换根 dp 比较恶心。
在 P1352 中,每个节点都可以选或不选,但选出来的点之间不能有边相连。
- 状态:\(dp_{i,0}\) 表示节点 \(i\) 不选的最大欢乐指数,\(dp_{i,1}\) 表示节点 \(i\) 选的最大欢乐指数。
- 转移:令 \(son_i\) 表示节点 \(i\) 的儿子集合,则 \(dp_{i,0}=\sum\limits_{1\leqslant j\leqslant n\&\& j\in son_i} \max(dp_{j,0}, dp_{j,1}),dp_{i,1}=\sum\limits_{1\leqslant j\leqslant n\&\& j\in son_i} dp_{j,0}+r_i\)。
- 拓扑序:首先找到那个没有上司的节点,以它为根,按深度从大到小进行 \(dp\),也可以直接边搜索边做。
- 初始状态:没有。
- 目标状态:\(\max(dp_{根,0},dp_{根,1})\)。
时间复杂度:\(O(n)\),空间复杂度:\(O(n)\)。
状压 dp
CSES1690 Hamiltonian Flights 模板。
状压 dp,就是把多维状态压缩成一个整数,通常是把每个节点的访问情况通过二进制的形式压缩成整数。
其实还算简单的,配合之前的 dp,将多维度压缩整数,注意细节即可。