浅谈树形DP

树形DP是动态规划中最难也最常考的内容。具有DP和图论相结合的特点。

但从本质上来说,树形DP只不过是一种线性DP,只是将它与搜索结合起来了而已。

树形DP的基本步骤

读图

树形DP的题目中,通常会给出一个树,因此我们首先把图读入并存储(建议用链式向前星QAQ vector好卡啊)

深搜

树形DP一般要借助深搜来完成(有一点像记搜),并在回溯时 顺便 更新一下信息。

深搜通常分为以下几个步骤:

  1. 初始化
    通常在dfs开头就进行初始化。

  2. 遍历出边

  3. 可行性剪枝
    通常要判断下一个点不是父亲节点

  4. 继续深搜

  5. 更新信息

树形DP典例示范

题目描述:
现有一棵树,给出一个数x,输出它子树的节点个数(包括x自己)

题目解析:
没什么好解析的了,都在代码里了

代码示范:

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 二叉苹果树)

posted @   Link-Cut-Y  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示