换根树形DP(二次扫描DP)

作用

当不同结点作为根结点时,状态转移的结果不一样,若枚举每个点作为根结点再DP,时间复杂度会很高。

这种情况下,使用换根DP处理相邻两个结点之间的贡献,达到快速换根的效果。

使用场景

对于一棵树,寻找以某个点 cur 为根结点取得的最大值或最小值或方案数。

实现步骤

  1. 任选 1 点作为根结点(比如结点 11),跑一遍树形 DP,得到 dp_i​ 表示以 ii 为根结点的子树的 XXX 的最大值或最小值或方案数。

  2. f_1=dp_1​,其中 f_i 表示以 ii 为全局根结点时 XXX 的最大值或最小值或方案数。

  3. 从根结点(上述中我们用 1 来举例)再次 DFS 遍历,从父结点到子结点转移得到 f_ifi​。

例题

Ⅰ:P3478 POI 2008 STA-station

很板的一道换根 DP 题。

分析
  1. 定义 dp_cur 表示以 cur 为根的子树的结点的全局(以固定点为根结点)深度之和。转移很好想:dp_{cur}+=dp_{nxt}。

  2. 初始状态:dp_{cur}=dep_{cur}​,其中 dep_{cur}​ 表示 cur 结点的深度。

  3. 定义 f_ifi​ 表示以 ii 为全局根结点的结点深度之和。很显然答案输出 f_ifi​ 的值最大的 ii。

  4. 考虑从上往下的转移,如从 cur 遍历子结点到 nxt。

  5. 虽然这题可以省略,但为了养成好习惯,f_1=dp_1​。

  6. 记得开 long long

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值