zoukankan      html  css  js  c++  java
  • 树形 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)

  • 相关阅读:
    LeetCode 1275. 找出井字棋的获胜者 Find Winner on a Tic Tac Toe Game
    LeetCode 307. 区域和检索
    LeetCode 1271 十六进制魔术数字 Hexspeak
    秋实大哥与花 线段树模板
    AcWing 835. Trie字符串统计
    Leetcode 216. 组合总和 III
    Mybatis 示例之 复杂(complex)属性(property)
    Mybatis 示例之 复杂(complex)属性(property)
    Mybatis 高级结果映射 ResultMap Association Collection
    Mybatis 高级结果映射 ResultMap Association Collection
  • 原文地址:https://www.cnblogs.com/mhpp/p/6628548.html
Copyright © 2011-2022 走看看