这里讲提高一点的内容,所以没有树形DP基础的,先看一下基础部分:

浅说——树形DP

闲言不表,看第一题。

这道题是典型的树上最长链问题。(就是一个模板题)

给定一棵树,树上共有N个节点(N<=5000) ,树上节点的编号从1到N,每个节点的儿子个数最多为N-1。

请求出这棵树上的经过节点数最多的一条不重复的链。

输入: 第一行一个数N,表示树有N个节点。 接下来N行,每行第一个数为Xi(0<=Xi<=N-1),表示编号为i的节点的儿子个数为Xi,接下来Xi个数,依次表示每一个儿子的编号。Xi为0表示没有儿子。

输出: 一行一个数,表示最长链经过的节点个数。 (内存限制10M)

样例输入:


样例输出:


问题分析

目标:如图计算1为根的树上最长链

动机:通过分析子树的相关信息,算出目标值

分析有两种情况:

一、最长链不经过1号节点.

这种情况下,找到的点A一定是最长链的一个端点。

由于1是最长链上的点,那么最长链的另一个端点到T的距离是一定的,因此A到T必定要取最长的距离,该链才能最长。此种情况容易理解,不加赘述。

二、最长链经过1号节点。

若T不在最长链上,则最长链必定在T的一个子树中。上图中最长链就在以C为根的子树中。

那么我们可以下一个结论:找到距离T最远的一个点A,那么A必定是最长链的一个端点,且从A到T的路径必定与最长链重合从A到C的这一段。

下面我们来证明结论:

假设T的最长链在子树C中,且子树C中最深的节点A对于根节点T的深度为h(A)。如果距离T最远的某个节点P不在子树C中,那么P-T-C-A的长度一定大于子树C中最长链的长度,与T中最长链在子树C中的条件矛盾。所以A必为最长链的一个端点,然后再一次搜索找到距离

A最远的节点B,AB即为最长链。
持续更新中……

最新文章

  1. 第一篇博客 用笨办法学python-14 提示和传递
  2. Java生成CSV文件实例详解
  3. 讨论一下js获取响应中后台传回来的BigInteger类型的数字时,后几位会自动变为0的问题
  4. 查看iOS模拟器应用的沙箱文件
  5. 配置tomcat,java运行环境
  6. Kibana4学习&lt;二&gt;
  7. mysql模糊查询 like/REGEXP
  8. Windows下搭建论坛
  9. Java 和 Javascript 的 Date 与 .Net 的 DateTime 之间的相互转换
  10. SQL2008安装提示&quot;Microsoft visual studio 2008早期之前的版本&quot;解决(这是我认为最简单有效的方法)
  11. 前端面试题之js篇
  12. SQL Server 缓存清理的一些原因
  13. 填充Z形二维数组
  14. Burp_用户名密码爆破
  15. [HNOI 2013]比赛
  16. 5分钟入门LingaScript-尝鲜中文版TypeScript
  17. django2.0 路由规则
  18. topcoder srm 390 div1
  19. Pandas读取文件
  20. day20-面向对象编程、继承

热门文章

  1. Gradle 1.12 翻译——第九章 Groovy高速入口
  2. 让你的Blend“编辑其他模板”菜单里出现你的Style
  3. 关于WPF你应该知道的2000件事
  4. 不得不说,我太佩服node了,连openXML也搞定了!
  5. WPF x:static的使用
  6. WPF 创建无边框的圆角窗口
  7. WPF开发之限制输入的控件---------转自CDSN
  8. phpexcel导出超过26列解决方案
  9. eclipse 插件编写(一)
  10. C++ 标准库概览(一分钟就看完了)