树形DP
1.简介:
树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果。
tips:树的遍历有从叶子节点->根节点和从根节点->叶子绩点两种节点,个人习惯从根节点开始遍历
2.树形DP的状态定义:
一般来说,树形DP的状态定义根据实际情况来定义,比如
  HDU1520的定义为dp[maxn][2]

  转移方程为:if(i来) dp[i][1]+=dp[j][0]//j是i的子节点

         else dp[i][0]+=max(dp[j][1],dp[j][0])//这里的0代表了不来,1代表了来

  题解:https://www.cnblogs.com/buerdepepeqi/p/9343127.html

  

  HDU1054的定义为dp[maxn][2]

  转移方程为:dp[v][1] += min(dp[u][1],dp[u][0]),dp[v][0] += dp[u][1]  //如果父亲结点没放哨兵,那么子结点肯定要放置哨兵,如果父亲放置了哨兵,那么子结点可以考虑放或者不放。

        由于子结点可能有多个,我们要依次从左到右遍历所以我们必须开一个bro来存放它前一个兄弟结点,每次处理完当前节点后就去处理兄弟节点

  题解:https://www.cnblogs.com/buerdepepeqi/p/9343878.html

  未完待续。。。。

3.分享一个树形DP讲的比较好的博客

https://www.cnblogs.com/mhpp/p/6628548.html

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)

最新文章

  1. JavaOO面向对象中的注意点(三)
  2. Angular2 架构
  3. CSS2样式中选择器的介绍
  4. Invalidate,Update与Refresh的区别
  5. JVM内存回收机制简述
  6. Silverlight动画之 Animation Easing
  7. Mime Types
  8. HDU4675【GCD of scequence】【组合数学、费马小定理、取模】
  9. Linux 内核学习的经典书籍及途径
  10. sublime部署开发环境
  11. 基于AdaBoost的人脸检测
  12. 一天搞定HTML----列表标签03
  13. windows之如何把iso文件转换为VHD文件
  14. bootstrap treeview实现菜单树
  15. vue引入css的两种方式
  16. Pycharm中怎么给字典中的多个键-值对同时加上单引号
  17. Java多线程之定时任务(Timer)
  18. Nginx-ingress-controller部署
  19. linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置
  20. 【HNOI2008】玩具装箱TOY &amp; 斜率优化学习笔记

热门文章

  1. CopyArrays
  2. [Cracking the Coding Interview] 4.5 Validate BST
  3. python2.7入门---字符串
  4. 联想ThinkPad S3-S440虚拟机安装,ubuntu安装,Hadoop(2.7.1)详解及WordCount运行,spark集群搭建
  5. AR技术介绍(Located in Android)
  6. Django-Content-type用法
  7. Linux下启动Oracle服务和监听程序步骤
  8. ES5新增数组方法(1):filter
  9. Spring 整合 Shiro
  10. 扩展欧几里得 求ax+by == n的非负整数解个数