树形dp之覆盖理论
INTRODUCTION:
这篇博客是针对树形dp中最小支配集的一个通用解法(own perspective),也是本人在做题中总结出的一个规律,如若之前尚未接触过支配集问题,建议先思索下面两个题然后再回来看本篇博客。
MAIN BODY
我们先对于思维的逻辑理解,之后再套用到实际题目
一个点可以覆盖与它距离为
假设上面这个图是一个n个点的树
这个时候我们分析其中一个点的状态
我们要去表达他的状态,不难发现它每个状态之间是有关联的,我们便可以把这些状态定义为:
-
表示可以从 覆盖到向上 层的最小放置点的个数 -
表示可以从$ i m-1 $层的最小放置点的个数
.
.
.
m+1.
m+2.
m+3.
.
.
.
2m.
为什么我起名为覆盖理论呢,下面便是我的理论
覆盖到某层则一定覆盖了这棵子树中这一层和这层一下的所有子树
“从
“从
注:为什么没有覆盖到m+1层因为我自身放了最多也只能管到向上m层,不可能再往上。 为什么没有覆盖到 -m-1 层因为这是必须的,如果没有将我向下这么多的子孙覆盖住,就不能够继续向上递归,因为我下面的情况并没有所有考虑完
此时,我们出现了一个重要的不等式,将是我们下面进行减缩代码的关键
状态转移
先分析上两层:
因为
因为 i 可以向上覆盖
如果是恰好覆盖,那么
然后可以总结出来规律:
向上覆盖到第
向上覆盖
如果恰好可以覆盖
再看向下
终极目标
我们希望找到整棵树都被覆盖的时候的最少节点数,那么需要覆盖到我们树的根部,结果就是f[1][m].
如何维护
我们上面说过了
首先我们需要对每一个只能覆盖到自己的子孙的部分初始化为
之后便是去遍历每一个子节点,并且向下递归整棵树。
然后便是将能够覆盖到自身节点及其以下的状态进行转移
之后我们要分情况进行讨论
-
如果我这个当前节点是叶子节点,那么我向上覆盖
层 就只能是自身放置,所以赋值为 -
如果我当前节点不是叶子节点,那么先将向上覆盖
层的状态初始化成 然后求它是哪一层叶子节点中的哪一个放置可以得到花费最小。然后进行转移
最后,也是最关键的一步 :便是维护我们上面的不等式。
这个时候我们就可以考虑将这个思维方式套用到我们的题目中了。
实战演练一:P2899
这个题就是一个标准的
注意这个题双向建边,开二倍空间。
再套用我们上面的思路就行,下面是 AC 代码(建议先写后看)
实战演练二:P2279
这个题目中不难看出是一个
感谢收看~
__EOF__

本文链接:https://www.cnblogs.com/carp-oier/p/17653001.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】