树形dp
树形dp
概述
树形dp 一般用于解决树上问题,答案需要可以从子节点转移到父节点,或者相反。通常的实现方式是在dfs 的过程中顺便求出答案。
树形dp一般分为几种:子树大小统计,树上(类)背包和树上距离问题。
树形dp没有什么前置技能,可以出现在NOIP及高阶的比赛中,难度跨度较大。
子树大小统计
我们平时在找树的重心等是其实就用到了动态规划的思想。许多题目让我们以子树大小为代价统计一些值,总体难度不大。
树上(类)背包问题
这类问题的状态往往有两维,每次利用子节点的状态来更新当前节点的状态,难度中等。由于是树形结构并且有顺序,这类问题的状态往往很清晰。
例题:[P1270 “访问”美术馆](%3Ca href="https://www.luogu.org/problem/P1270"%3Ehttps://www.luogu.org/problem/P1270%3C/a%3E)
树上距离问题
这类问题常常让我们选择树上的一些节点,并且对距离这些节点一定距离的点有一些要求。
此时我们往往涉及状态f[x][d][]
,其中x
表示节点编号,d
表示距离,每次根据子树归并状态。但在距离不定时,子树有时会延伸过当前节点影响到兄弟子树,此时需要涉及d
的含义相反的g[x][d][]
表示需要补充的长度