首页 > 代码库 > 树形 DP 总结

树形 DP 总结

本文转自:http://blog.csdn.net/angon823/article/details/52334548

介绍

1、什么是树型动态规划 

顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向: 

    1、叶->根:在回溯的时候从叶子节点往上更新信息

    2、根 - >叶:往往是在从叶往根dfs一遍之后(相当于预处理),再重新往下获取最后的答案。

    不管是 从叶->根 还是 从 根 - >叶,两者都是根据需要采用,没有好坏高低之分。

2、树形动态规划的优美之处

树真的是一种特别特别优美的结构!用来做动态规划也简直是锦上添花再美不过的事,因为树本身至少就有“子结构”性质(树和子树);也本身就具有递归性。所以在树上DP其实是其所当然的事,相比线性动态规划来讲,转移方程更直观,更易理解。

3、难点

   1、和线性动态规划相比,树形DP往往是要利用递归的,所以对递归不熟悉的同学,是一道小小的障碍,说是小小的,因为要去理解也不难。
   2、细节多,较为复杂的树形DP,从子树,从父亲,从兄弟……已经一些小的要处理的地方,脑子不清晰的时候做起来颇为恶心
   3、状态表示和转移方程,也是真正难的地方。做到后面,树形DP的老套路都也就那么多,难的还是怎么能想出转移方程,状压DP、概率DP这些特别的DP应该说做到最后都是这样!

4、补充

   建有向图还是无向图? 一般来说我们做树DP都是从上往下递归,如果不乱搞是不会从子节点往根节点的遍历的,这时候可以建有向图,只加边一次就可以,对于有“思想洁癖”的人来说,如果加一次边就可以再让他加两次是很难受的。但是有些题目可能很隐蔽的某个地方涉及到从子节点往上访问,就会错的很惨。所以,一般不非常确定建有向图就可的话还是建无向图吧。

正文

暂时分入门,一般、难三个等级,而不分类别。以后做的题目多了再改。

1、入门题

1、HDU 1520 Anniversary party 子节点和父亲节点不能同时选,问最大价值。题解
2、HDU 2196 Computer 求树上每个点能到达的最远距离  题解

2、一般

1、D. Choosing Capital for Treeland 给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到u去,则要逆转该边方向)题解
2、Godfather  求树的重心(删除该点后子树最大的最小)题解
3、POJ 3107 Tree Cutting  求删除哪点后子树最的小于等于节点总数的一半 题解
4、POJ 3140 Contestants Division 删除某边后剩余两个分支差值最小是多少 题解

3、难

1、HDU 3586 Information Disturbing 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超过上限limit,问在保证总费用<=m下的最小的limit。题解
2、POJ 3162 Walking Race  一棵n个节点的树。wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离的差小于M,问怎么取使得天数最多?题解
3、HDU 5834 Magic boy Bi Luo with his excited tree 每个节点有一个价值Vi,每走一次一条边要花费Ci,问从各个节点出发最多能收获多少价值 题解
4、POJ 2152 Fire n个节点组成的树,要在树一些点上建立消防站,每个点建站都有个cost[i],每个点如果不在当前的点上建站,也要依赖其他的消防站,并且距离不超过limit[i]。求符合上述条件的最小费用建站方案 题解
5、POJ 1741 Tree 求树上距离小于等于K的点对有多少个 题解
 
 
列出一些经典问题吧:

1:给出一棵树 每个节点有权值  要求父节点和子节点不能同时取 求能够取得的最大值  (hdu1520)

2:给出一棵树,求离每个节点最远的点的距离 (hdu2196)

3:1>在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中允许攻克M个城堡并获得里面的宝物。但由于         地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。求获得尽量多的宝物应         该攻克哪M个城堡。 (hdu1561)

题解:树形dp+背包 

     2>每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被清空时,才可以清扫它          的子节点,而清扫需要一定的人员。给定M个人员,N个结点的树,求最大brain和 (hdu1011)

     3>现在有n个村子,你想要用收买m个村子为你投票,其中收买第i个村子的代价是val[i]。但是有些村子存在从属关                系,如果B从属于A国,则收买了A也意味着买通了B,而且这些关系是传递的。问你最小要付出的代价是多                        少? (poj3345)

4:1>一棵树,定义每个节点的balance值:去掉这点节点后的森林里所有树的最大节点数。求出最小的balance值和其所           对应的节点编号(poj1655)

     2>给你一棵无向树 T,要求依次去除树中的某个结点,求去掉该结点后变成的森林 T‘ 中的最大分支。并要求该分支为            去除的结点尽可能少。答案可能有多个,需要按照节点编号从小到大输出 (poj3107)

5:给一棵树, n结点<=1000, 和K< =200,  在这棵树上找大小为k的子树, 使其点权和值最大 (zoj3201)

6:给一个树状图,有n个点。求出,去掉哪个点,使得剩下的每个连通子图中点的数量不超过n/2。如果有很多这样的            点,就按升序输出。n<=10000 (poj2378)

7:一棵n个结点的带权无根树,从中删去一条边,使得剩下来的两棵子树的节点权值之和的绝对值最小,并求出得到的最     小绝对值 (poj3140)

8:给出一些点,有值,给出一些边,然后求去掉一条边后将分成连通的两部分,且两部分的差值最小 (hdu2242)

9:有n个点组成一个树,问至少要删除多少条边才能获得一棵有p个结点的子树 (poj1947)

10:一棵树n<=1000(节点的分支<=8),Snail在根处,它要找到在某个叶子处的house而其中一些节点上有worm,worm        会告诉它的house是否在这个子树上求Snail最快寻找到house走过路径的期望值 (poj2057)

11:给你一颗苹果树,有N个节点每个节点上都有一个苹果也就是有一个权值,当你经过这个节点是你将得到这个权值,         重复走节点是只能算一次,给你N-1条边。问你只能走K步能得到的最大权值和 (poj2486)

12:一颗二叉苹果树树上结苹果,要求剪掉几棵枝,然后求保留Q根树枝能保留的最多到苹果数 (ural1018)

13:给定一棵树,求最少连多少条边,使得每个点在且仅在某一个环内。 (poj1848)

14:在一棵树形的城市中建立一些消防站,但每个城市有一个最大距离限制,求需要的最小花费 (poj2152)

树形 DP 总结