树形 dp 学习笔记
状态设计
基本上每一种 dp 都有一种标准的 dp 定义方式,树形 dp 也是如此:
定义
从分析子树入手,转移便是找到某一子树中,根节点与各子树、边权间的递推关系。
最优解常常是关于根节点的函数。
它的子结构是一颗子树。
实现方式
树形 dp 的实现一般是依靠树的后序遍历(先子节点,后根节点)为理论依据。
算法落到实处,便是运用 dfs 的方式实现。
先从根到叶,然后从叶到根来递推。
经典套路
- 把某个节点的状态加入 dp 数组,如 没有上司的舞会,设计
表示某个节点选不选进去。 - 把树形 dp 与背包结合,把选
个物品加入 dp 数组,如 二叉苹果树 ,设计 表示在 为根节点的子树中,选 条边最大的权值和,按背包来转移,注意边界特判;选课,树形背包模板题。
细节
- 在某一子树时,设
表示以 为根节点的子树里选 个节点的最优解。此时如果以 为根节点的子树里没有 那么多的节点,就会无意义地转移,所以可以通过特判来优化这部分的复杂度(卡常)。不特判一般也不会错。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战