动态规划进阶?

树形 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,将多维度压缩整数,注意细节即可。

posted @ 2023-10-10 00:50  wnsyou  阅读(12)  评论(0编辑  收藏  举报