换根dp学习笔记

0x54. 动态规划 - 树形DP(习题详解 × 12) 阅读详情
1.换根dp

换根 d p dp dp其实是树形 d p dp dp的一个分支,通常用来在线性或亚线性的复杂度里解决树上定点的问题
刚开始学习的时候可能会不太好理解,但是做多题之后就好了

2.引入

现在有一个这样的问题

给你一棵树,要找一个点 p p p,使得当 p p p为根的时候,所有节点的深度之和最大

首先考虑暴力怎么做,就是暴力枚举 p p p,然后 Θ ( n ) \Theta(n) Θ(n)计算答案,最后总复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2)
是不是有点慢?这题的范围是 n ≤ 1 0 6 n\leq 10^6 n≤106,显然挂掉了
那么我们应该怎么进行优化呢?
就需要用到换根 d p dp dp的做法

3.做法流程

换根 d p dp dp通常需要两次 d f s dfs dfs来实现,第一次 d f s dfs dfs时,我们先随便指定一个点为根(通常为 1 1 1),但是不同的题有特例

我们在第一次 d f s dfs dfs的时候处理出子树中的一些信息

但是因为我们发现影响答案的不一定只在子树内部,在另一部分也是可以的,所以我们需要第二次 d f s dfs dfs统计不在子树中的答案情况,但是这一部分的答案我们发现其实是可以利用他到根之间的子树的答案推出来

然后合并答案就可以

听起来云里雾里?接下来我们回到例题中

先考虑子树中的信息,我们用 f i f_i fi​表示以 i i i为根节点的子树中,所有点的深度之和

那么显然我们会得到这样的一个转移方程 f u = ∑ f v f_u=\sum f_v fu​=∑fv​

然后在我们进行第二次 d f s dfs dfs时,我们访问到哪个节点,就令他为根

当根从 u u u“换到” v v v时,我们发现原来所有的在 v v v这棵子树的点的深度都 − 1 -1 −1,相应的,其他的不在 v v v这棵子树的点的深度都会 + 1 +1 +1

这句话可能不太好理解,但是这也是换根 d p dp dp的难点。换根 d p dp dp的根本思想就是把一个在变的东西变成我们知道的东西,相当于一个动态转成静态的过程

如果不太理解的话可以手画一画,但是应该还好,毕竟这可以算换根 d p dp dp最简单的题了

也就是说,如果我们用 g i g_i gi​表示以 i i i为根的时候的答案的情况,那么转移方程就是

g v = g u − s i z v + ( n − s i z v ) g_v=g_u-siz_v+(n-siz_v) gv​=gu​−sizv​+(n−sizv​)

然后我们最后找 g g g的 max ⁡ \max max就好了

那么这样的话经过两次 d f s dfs dfs,我们最开始的问题就转化成一个复杂度 Θ ( n ) \Theta(n) Θ(n)的了

4.程序架构

换根 d p dp dp其实有一个半模板的东西,就是基本上所有的程序都长得差不多,只是维护的不同而已

每个人可能有自己的写法,这里给出一个我自己喜欢的写法的这道题的伪代码伪代码

function dfs1(u,fa)
begin
//初始化变量
siz[u]<-1
f[u]<-dep
for v in son{u}
    if v=fa continue
    else
        dfs1(v,u)
        //更新子树中的答案
        siz[u]<-siz[u]+siz[v]
        f[u]<-f[u]+f[v]
end

function dfs2(u,fa)
begin
//根据fa的答案来更新u的答案
g[u]<-g[fa]-siz[u]+(n-siz[u])
for v in son{u}
    if v=fa continue
    else
        dfs2(v,u)
end

in main
readall
dfs1(1,0)
dfs2(1,0)
for i=1->n
    if f[i]+g[i]>max
        max=f[i]+g[i],ans=i
print ans
return
5.例题分析

我们前面解决一个简单的换根 d p dp dp问题,但是显然丧心病狂的出题人不可能只让你维护一个那么好维护的 s i z siz siz

P3047 [USACO12FEB]Nearby Cows G

看到数据范围应该很容易猜到这题复杂度应该是 Θ ( n k ) \Theta(nk) Θ(nk)

我们用 f i , j f_{i,j} fi,j​表示以 i i i为根节点的子树中距离 i i i为 j j j的数量

然后随便转移一下 f u , j = f v , j − 1 f_{u,j}=f_{v,j-1} fu,j​=fv,j−1​

接下来考虑换根,因为和他距离 ≤ k \leq k ≤k的点不可能只在下面

用 g u , k g_{u,k} gu,k​表示不在 u u u的子树中的距离他为 j j j的数量

向下走的时候,首先会有他爸爸再往上的,但是也有可能有他爸爸的儿子,这个时候我们需要减掉 u u u的贡献(就是这个东西让换根 d p dp dp变得特别恶心),也就是说

g u , j = g f a , j − 1 + f f a , j − 1 − f f a , j − 2 g_{u,j}=g_{fa,j-1}+f_{fa,j-1}-f_{fa,j-2} gu,j​=gfa,j−1​+ffa,j−1​−ffa,j−2​

然后还有一些细节,这里不具体说了


P2986 [USACO10MAR]Great Cow Gathering G

跟最开始说的例题差不多,只是加上了边权点权,如果理解了上面那个这个应该不难

就不说了


CF1324F Maximum White Subtree

这是最近CF一场 d i v 3 div3 div3的最后一题,当时我还没有接触到换根 d p dp dp的时候自己yy了一个换根 d p dp dp的做法,居然还给A掉了,后来才知道这是换根 d p dp dp

首先考虑子树里面怎么维护,我们用 f i f_i fi​表示 i i i为根节点子树中黑白差最大值

转移就是 f u = ∑ max ⁡ ( f v , 0 ) f_u=\sum \max(f_v,0) fu​=∑max(fv​,0)

然后我们考虑换根,用 g i g_i gi​表示 i i i点的答案,那么我们就得到了一个这样的的转移

g u = { max ⁡ ( g f a , f u ) , f u ≥ 0 max ⁡ ( g f a , c o l o r u ) , f u < 0 g_u= \begin{cases} \max(g_{fa},f_u),f_u\geq 0 \\ \max(g_{fa},color_u),f_u< 0 \end{cases} gu​={max(gfa​,fu​),fu​≥0max(gfa​,coloru​),fu​<0​

最后输出 g u g_u gu​就可以了


P6419 [COCI2014-2015#1] Kamp

我们用 f i f_i fi​表示以 i i i为根节点的子树中,从 i i i出发又回到 i i i并且把所有人送回去的路程,当然是最短的,那么显然的,有一个这样的转移方程

f u = { f v + 2 × dis ⁡ ( u , v ) , s i z v > 0 0 , s i z v = 0 f_u= \begin{cases} f_v+2\times \operatorname{dis}(u,v),siz_v> 0\\ 0,siz_v=0 \end{cases} fu​={fv​+2×dis(u,v),sizv​>00,sizv​=0​

但是这道题恶心的地方就在于,我们最后车不一定要回到起点,那么一个显然的贪心策略是我们最后送离起点最远的那个点,然后就不回来了,所以最后答案就是 f u f_u fu​减去以 u u u为起点的最长链(当然链尾是一个有人的点)

但是根据换根dp的套路,我们还需要维护一个次长链,为什么呢?我们下面在换根的时候说

也就是说,我们第一次 d f s dfs dfs需要维护四个东西

  • s i z i siz_i sizi​表示以 i i i为根节点的子树的大小

  • f i f_i fi​表示以 i i i为根节点的子树中,从 i i i出发又回到 i i i并且把所有人送回去的路程

  • d i s 1 i dis1_i dis1i​,最长链

  • d i s 2 i dis2_i dis2i​,不在最长链所在子树中的次长链


换根的时候,我们用 g i g_i gi​表示不在 i i i子树里面的的答案情况

考虑进行分类讨论,以样例为例

在这里插入图片描述

在以 1 1 1为根的时候,当我们 d f s dfs dfs到 2 2 2的时候,我们需要包含的应该是 1 1 1往上的部分,也就是 g 1 g_1 g1​,同时应该包含除了 2 2 2这棵子树以外的答案部分,也就是 f 1 − f 2 f_1-f_2 f1​−f2​,但是这还不够,我们发现, f 1 − f 2 f_1-f_2 f1​−f2​之后我们仍然包含 2 × dis ⁡ ( 1 , 2 ) 2\times \operatorname{dis}(1,2) 2×dis(1,2)这一部分的答案,当然如果下面还有点可以不管,但是如果我们访问到 5 5 5时,实际上 ( 2 , 5 ) (2,5) (2,5)这条边我们是不用走的,所以我们需要单独判断一下

那么 g g g的转移方程就是

g u = g f a + f f a − f u + 2 × dis ⁡ ( u , f a ) × ( s i z u > 0 ) g_u=g_{fa}+f_{fa}-f_u+2\times\operatorname{dis}(u,fa)\times(siz_u>0) gu​=gfa​+ffa​−fu​+2×dis(u,fa)×(sizu​>0)

但是同时我们的最长链也有可能从上面更新过来对吧,所以我们再搞一个 u p up up数组表示他往上走的最长链

更新 u p up up的时候就需要用到我们之前维护的 d i s 2 dis2 dis2了,因为如果最长的在 u u u这棵子树里面,我们就需要 d i s 2 dis2 dis2, u p up up的转移方程就很简单了

u p u = { max ⁡ { u p f a , d i s 1 f a } + dis ⁡ ( u , f a ) , d i s 1 f a − d i s 1 u ≠ dis ⁡ ( u , f a ) max ⁡ { u p f a , d i s 2 f a } + dis ⁡ ( u , f a ) , d i s 1 f a − d i s 1 u = dis ⁡ ( u , f a ) up_u= \begin{cases} \max\{up_{fa},dis1_{fa}\}+\operatorname{dis}(u,fa),dis1_{fa}-dis1_u\neq\operatorname{dis}(u,fa) \\ \max\{up_{fa},dis2_{fa}\}+\operatorname{dis}(u,fa),dis1_{fa}-dis1_u=\operatorname{dis}(u,fa) \end{cases} upu​={max{upfa​,dis1fa​}+dis(u,fa),dis1fa​−dis1u​​=dis(u,fa)max{upfa​,dis2fa​}+dis(u,fa),dis1fa​−dis1u​=dis(u,fa)​

那么对于节点 i i i,我们最后的答案就是 f i + g i − max ⁡ { d i s 1 i , u p i } f_i+g_i-\max\{dis1_i,up_i\} fi​+gi​−max{dis1i​,upi​}


CF708C Centroids

这道题比较特殊,我们前面说换根 d p dp dp问题通常是随便选点当根,但是这道题有点不同(当然不是随便选就不能做了),我们可以选择重心最为最开始的根以避开复杂的分类讨论

我们发现,一个点最多只会有一个子树的大小超过 n 2 \frac{n}{2} 2n​,我们只要能拆下来一部分,接到这个点下面显然是更优的,而且我们尽量拆的多,只要不超过 n 2 \frac{n}{2} 2n​就可以。因为只让砍一刀,所以切下来的肯定还是一棵子树。所以我们需要维护的是这个点为根时所有子树大小不超过 n 2 \frac{n}{2} 2n​的最大值即可

但是在固定根时,最大的部分有可能在下面也有可能在上面,所以我们固定根为重心,这样答案一定从上面转移过来

但是注意一棵树最多有两个重心,所以我们要让两个重心分别为根计算答案

显然我们维护 f i f_i fi​为最大的子树, g i g_i gi​为次大的子树

那么怎么计算能够切下来的最大的大小不超过 n 2 \frac{n}{2} 2n​的子树这个东西 h i h_i hi​呢?

我们可以列出这样一个转移方程

h v = { max ⁡ ( h u , f i ) , s i z v ≠ f i max ⁡ ( h u , g i ) , s i z v = f i h_v= \begin{cases} \max(h_u,f_i),siz_v\neq f_i \\ \max(h_u,g_i),siz_v=f_i \end{cases} hv​={max(hu​,fi​),sizv​​=fi​max(hu​,gi​),sizv​=fi​​

然后对于每一个点 i i i,如果 n − s i z i − h i ≤ n 2 n-siz_i-h_i\leq \frac{n}{2} n−sizi​−hi​≤2n​,就是 t r u e true true,否则是 f a l s e false false

Yolov5s可视化网络结构图 Yolov5共有四种网络结构,每种网络深度和宽度上都不相同。 (1) Yolov5s可视化网络结构图:点击查看 (2) Yolov5m可视化网络结构图:点击查看 (3) Yolov5l可视化网络结构图:点击查看 (4) Yolov5x可视化网络结构图:点击查看 ... 阅读详情

相关推荐

二次开发vba_CATIA VBA(VBS)二次开发:使用Search批量选择元素

在CATIA二次开发中很多在程序中进行自动交互的方法或函数都需要使用选择集作为参数,将几何元素按照要求批量添加到选择集中也是实现程序自动运行的有效方法。在前面的文章《CATIA使用VBA(VBS)二次开发时用户的交互选择》和《CATIA使用VBA(VBS)二次开发时工程图和草图位置的交互选择函数Indicate2D》中介绍了在CATIA VBA(VBS)二次开发中用户和选择集之间的交互操...

weixin_32497403的博客 1321

换根dp

换根dp解决的问题示例讲解例题 解决的问题 基于树上dp的基本模型,题目初始不给出根节点,需要遍历每一个根节点,达到某一个根节点的最佳情况。 暴力的思路是循环每个节点作为根节点,同时在遍历整个树,时间复杂度是O(n2)O(n^2)O(n2)。 换根dp主要就是将时间复杂度降到O(n)O(n)O(n),在根结点切换时,直接通过一些已经计算过的数据在O(1)O(1)O(1)就能得到另一个根的结果。 一般是通过二次扫描,第一次dfs获得预处理数据,第二次dfs进行根节点切换 示例讲解 需要找到以x点为根结点的树,

weixin_44232130的博客 2194

【移动APP测试】Firebase Test Lab (FTL) 实战指南:从零搭建自动化测试流水线

本文详细介绍了Firebase Test Lab (FTL) 在移动APP测试中的实战应用,从零搭建自动化测试流水线。通过真实设备、虚拟设备和iOS设备的全面覆盖,FTL帮助开发者高效进行兼容性测试、性能监控和崩溃分析,显著提升应用质量。文章还提供了设备选择策略、成本控制技巧和CI/CD集成的最佳实践,助力团队优化测试流程。

weixin_29281915的博客 253

【学习笔记】详解换根法(换根DP)

【学习笔记】详解换根法(换根DP)

weq2011的博客 6245

【信号与系统实战解析】—— 拉普拉斯变换在电路分析中的关键应用

本文深入解析了拉普拉斯变换在电路分析中的关键应用。通过将时域微分方程转换为复频域的代数方程,系统化处理初始条件,并利用零极点图分析电路稳定性与频率响应。文章以RLC串联电路为例,详细演示了s域建模、性质运用及综合分析方法,为工程师提供了分析动态电路的强大工具与清晰视角。

weixin_29093017的博客 174

Xiaojie雷达之路---毫米波雷达基础知识---中频信号的相位

本篇文章主要介绍毫米波雷达的基础知识中的中频信号的相位 文章目录傅里叶变换的快速回顾中频信号的相位中频信号对物体微小位移的灵敏度如何2个chirps来对一个物体的速度进行测量测量一个振动的物体 傅里叶变换的快速回顾 傅里叶变换是将一个信号从时域中转换到频域中,在时域中的一个正弦信号将在频域中产生一个峰值,在大多数情况下,在频域中的一个信号是一个复数(每个值是一个振幅和相位的向量),表示为AejθAe^{j\theta}Aejθ 在频域中峰值的相位等于正弦函数的初始相位 中频信号的相位 上一篇文章中提到,

XiaoJie的博客 1万+

树形dp——换根dp

通过观察,我们发现,右边的深度减少了,左边的增加了,减少的节点为未换根之前以0为根节点经过2的所有路径上的节点,增加的为没有经过2的。我们假设某个节点为根,将无根树化为有根树,在搜索dfs统计子树的深度和,则可以用一次搜索算出以该节点为根时的深度和,其时间复杂度为。就表示为上升的深度,不经过child的子节点树都增加,不经过的节点数目就是从节点数目减去经过的节点数目。如图,我们的根节点就是0,接下来我们选取子节点2作为新的根节点,对其进行换根。但这样求解出的答案只是以该节点为根的,并不是最优解。

m0_74176921的博客 860

泛微OA表单开发实战:如何用JavaScript动态控制明细表的必填与可编辑属性

本文详细介绍了如何在泛微OA系统中使用JavaScript动态控制明细表字段的必填与可编辑属性。通过主表字段变更事件监听和明细表字段属性批量修改,实现智能化的表单交互,提升用户体验和系统灵活性。文章深入解析了关键API的使用方法,并提供了实战代码示例和最佳实践。

weixin_30955617的博客 545

动态规划:(2):树形dp与换根dp

本文介绍了树形动态规划(DP)的基本概念和应用场景。首先通过一道热身题展示了树结构问题的解题思路,随后详细讲解了树形DP的实现方法,包括状态转移方程设计和递归求解过程。文章还介绍了换根DP技术,用于求解以所有节点为根的最优解问题,并通过例题演示了如何利用子树信息优化计算。最后,作者总结了树形DP的核心思想,并强调通过具体例题理解抽象算法的学习方法。全文以通俗易懂的方式呈现了树形DP的基本框架和典型应用。

jzoj_ylz的博客 1295

python:实现brutefore破解wifi(附完整源码)

python:实现brutefore破解wifi(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 5702

最新Python爬虫实战(入门爬虫篇)——案例17:某天气网40天天气预报数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过分析某天气网的数据接口,成功实现了对40天天气预报数据的批量采集。抓包分析:利用浏览器开发者工具找到隐藏的JSONP数据接口,掌握URL构成规律。请求模拟:构造带有Referer和User-Agent的请求头,添加时间戳参数避免缓存,获取原始数据。数据解析:处理JSONP格式,去除前缀后使用json模块解析,提取所需字段并规范化日期格式。数据存储:利用pandas将结构化数据保存为Excel文件,便于后续分析和使用。动态数据接口的发现与分析JSONP数据的清洗与解析。

努力让自己发光,对的人才能迎着光而来 22万+

【算法】换根DP

834. 树中距离之和。

小威的博客 1229

Exploring Automated Distractor Generation for Math Multiple-choice Questions via Large Language Mode

多项选择题(MCQ)在几乎所有级别的教育中都无处不在,因为它们易于管理、评分,并且是评估和实践中可靠的格式。MCQ最重要的方面之一是干扰因素,即旨在针对真实学生常见错误或误解的不正确选项。迄今为止,对于教师和学习内容设计师来说,制作高质量的干扰物的任务在很大程度上仍然是一个劳动和时间密集型的过程,其可扩展性有限。在这项工作中,我们研究了数学MCQ领域的自动干扰物生成任务,并探索了从上下文学习到微调的各种基于大型语言模型(LLM)的方法。

c_cpp_csharp的专栏 317

换根 dp 学习笔记

最初所有的顶点都是白色的。在游戏的第一个回合中,你选择一个顶点并将其涂成黑色。然后在每个回合中,你选择一个与任何黑色顶点相邻的白色顶点。个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大。容易发现,假如根为定,那么染色所获得的代价就是子树的大小,如上即可。的代价将根移动到相邻的节点。为根的时候,深度之和的最大值。前提知识,树的直径的性质:令树的直径两端为。所以这题可以先求出来树的直径,然后枚举。到树的其他节点的最长距离,要么是。你的任务是使你获得的点数最大化。所在的白色连通块大小。

Mason233Hello的博客 1520

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

换根 DP 学习笔记

简介 换根 DP 是树形 DP 的一个分支,用于解决根节点不确定的问题,可以把 O(n)O(n)O(n) 枚举根节点的过程通过两次 dfs 优化掉,(据说)是一种重要的技巧。 分析 以一道经典例题 [POI2008]STA-Station 为例。 题意非常明了了,不解释了。 正如一般换根 DP 学习笔记的套路,我们先想想怎么 O(n2)O(n^2)O(n2) 的解决这个问题,非常简单,我们可以枚举一个根,然后 O(n)O(n)O(n) dfs 查询深度最后取 max⁡\maxmax。 显然 O(n2)O(n

cryozwq的博客 204

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【算法学习笔记】换根DP -- java代码实现

给定一个、连通的树。树中有 n 个标记为 0…n-1 的节点以及 n-1 条边。给定整数n和数组edgesai​bi​]表示树中的节点ai​和bi​之间有一条边。返回长度为n的数组answer,其中 answer[i] 是树中第 i 个节点与所有其他节点之间的距离之和。

PleaseBeStrong的博客 756

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

dp学习笔记7 换根dp不会捏

题目 题意: 有一棵 n 个点的树,每条边有一流量限制。令某一个点为根节点,向根节点灌水,最终从叶子节点流出的水量和为这一个点的最大流量,请求出每个点的最大流量。 思路: f[i]:表示以i为根的子树最多能承载的流量(当以1为根时). f[i] = Sigma min(f[son] + a[i][son]),流量受到两个方面的限制,一是儿子这棵子树能承载的最大流量,二是这条边的最大流量。 一遍dfs即可求出f[1]. 设置v[i]:表示换根后以i为根的子树的流量改变量. 接下来我们考虑换根的影响,即把根从

xianqiuyigedao的博客 198

【学习笔记】树型DP学习笔记

省流:被吊打了 自己开的一个坑,死也要填完它。 希望我随手写下的笔记对您的学习有所帮助(也不太可能)。 更改日志 2024/01/08:开坑,写了树的直径和换根DP,写不动了((( 2024/01/08 晚上:更新了最小点覆盖和最大独立集,看来精神还可以,顶着明天做手术的风险 2024/01/09:修改错误+增补解释说明(主要在换根DP处)。 学习背景 看着那么多dalao会树型DP,我这个小蒟蒻也来挑战一下。 结果还是被dalao吊打(悲 正片开始 了解树型DP 字面意思,树型DP就是在树上做 DP 或是

2301_77504182的博客 1645

2019暑假集训 7/31

学习内容:换根dp+线段树+多校 今日完成题数(不包含多校):6 多校补题情况(之前定的每支队伍标准):✔ 今日看书情况:0页 学习算法的总结 无 今日做题总结 CF 1187E 换根dp 先选一个点为root 处理出size 和 题目所描述的dp值 然后我们再dfs换根 每次维护的值就是父节点先减去当前点的值 然后以当前点为根加上原父节点的值 https://pas...

diangan7073的博客 146

换根DP入门

简述 换根DP是一类特殊的树形DP。 在解题过程中,存在一类树上问题,要求我们求解每个节点做为根节点的时的一些数据的问题。朴素算法一般是O(n2)O(n^2)O(n2)地进行n次dfs。遇到这种问题时,我们可以通过考察根节点转移到相邻节点时的影响,从而得出状态转移方程,进而O(1)O(1)O(1)地转移根节点得到新的答案。最后达到将问题总的复杂度降到O(n)O(n)O(n)的目的。 问题引入 给定一棵n个节点无向树(n个节点,n-1条无向边的连通图),要求选出一个节点,使得该节点做为根节点时,所有节点的深度

Arctic_Clam的博客 1246

树上dp之换根dp

换根dp是树上dp的一种我们在什么时候需要用到换根dp呢?当题目询问的属性,是需要当前结点为根时的属性,这个时候,我们就要使用换根dp换根dp的基本思路:假设题目询问的的属性为x通常我们会进行两次dfs第一次dfs,我们选取任意一个结点作为给出的无根树的根,对其进行dfs,并求出这个根的x,以及一些其他辅助数组(即节点与其子树的一些属性关系)第二次dfs,我们记dp[i]为对于结点i而言,节点i作为树的根时,我们要求的属性x。

Se_ren_di_pity的博客 1392

换根 DP 简介

● 换根 DP 通常遵循一个固定的两遍 DFS 流程

hnjzsyjyj的专栏 1169

换根 dp

那么就会出现重复计算的情况。注意:换根时要注意第一次。的部分,此时如果直接将。

m0_72761451的博客 740

换根 DP:进阶练习笔记

观前提醒:本文非新手向文章,不建议作为换根 DP 入门使用。 换根 DP 是树状 DP 的一种,思维难度较高,但是学会以后很套路也很轻松。 主要步骤: + 第一次 DP(固定根) + 求解以某一个固定点为根时的子问题 + 同时可以顺便求出其它需要用到的数据 + 第二次 DP(换根) + (临时)消除该子节点对父节点的贡献 + 将这个父节点的贡献合并到子节点上

Jerrycyx的博客 1008

集训DAY8之树形 DP与换根DP

树形动态规划(Tree DP)是动态规划在树结构上的具体应用,它充分利用了树的递归特性和层次结构来设计高效的求解策略。作为无环连通图,树的特殊性质为动态规划提供了天然的计算框架。在树形 DP 中,我们通常将问题分解为子树问题:对每个节点计算状态值,然后根据父子关系将这些状态值向上传递。这种自底向上(后序遍历)或自顶向下(前序遍历)的计算方式,与树的遍历顺序完美契合。状态定义通常与子树信息密切相关状态转移依赖于子节点的状态无环特性避免了循环依赖问题计算顺序由树的遍历顺序决定。

Liyankai1523900的博客 845
上一篇: 2020.4.25 集训总结
下一篇: AtCoder ABC165
NephrenRuqInsania
博客等级 码龄8年 20粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值