树形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][]表示需要补充的长度

P1352 没有上司的舞会
P1122 最大子树和
P3267 [JLOI2016/SHOI2016]侦察守卫
posted @ 2019-08-03 19:40  guoshaoyang  阅读(195)  评论(0编辑  收藏  举报