浅谈树形DP
树形DP是动态规划中最难也最常考的内容。具有DP和图论相结合的特点。
但从本质上来说,树形DP只不过是一种线性DP,只是将它与搜索结合起来了而已。
树形DP的基本步骤
读图
树形DP的题目中,通常会给出一个树,因此我们首先把图读入并存储(建议用链式向前星QAQ 好卡啊)
深搜
树形DP一般要借助深搜来完成(有一点像记搜),并在回溯时 顺便 更新一下信息。
深搜通常分为以下几个步骤:
-
初始化
通常在dfs开头就进行初始化。 -
遍历出边
-
可行性剪枝
通常要判断下一个点不是父亲节点 -
继续深搜
-
更新信息
树形DP典例示范
题目描述:
现有一棵树,给出一个数,输出它子树的节点个数(包括自己)
题目解析:
没什么好解析的了,都在代码里了
代码示范:
void dfs(int u, int father)
{
sz[u] = 1; // 初始化,刚开始子树大小就是1,即它本身
for (int i = h[u]; i; i = ne[i]) // 遍历出边
{
int j = e[i];
if (j == father) continue; // 可行性剪枝,判断父亲
dfs(j, u); // 继续深搜
sz[u] += sz[j]; // 统计答案
}
}
树形DP经典例题
[https://www.luogu.com.cn/problem/P2015](luogu 二叉苹果树)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示