树形DP 未完待续

参考书籍:

《信息学奥赛一本通提高版》

《算法竞赛进阶指南》

《算法竞赛入门经典(第2版)》

参考诸多博客汇总:

https://blog.csdn.net/txl199106/article/details/45373507

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

https://blog.csdn.net/nan81962325/article/details/79837073

https://blog.csdn.net/qq_41444888/article/details/81503425

 

【定义】

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

 

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

 

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

 

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

【算法应用】

给定一棵有N个节点的树(通常是无根树,也就是有N-1条无向边),我们可以任选一个节点为根节点,从而定义出每个节点的深度和每棵子树的根。在树上设计动态规划算法时,一般就以节点从深到浅(子树从小到大)的顺序作为DP的“阶段”。DP的状态表示中,第一维通常是节点编号(代表以该节点为根的子树)。大多数时候,我们采用递归的方式实现树形动态规划。对于每个节点x,先递归在它的每个子节点上进行DP,在回溯时,从子节点向节点x进行状态转移。

【树的特点与性质】

1、 有n个点,n-1条边的无向图,任意两顶点间可达

2、 无向图中任意两个点间有且只有一条路

3、 一个点至多有一个前趋,但可以有多个后继

4、 无向图中没有环;

重点来了:

树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系。利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的程序。而深搜的特点,就是“不撞南墙不回头”。下面例题具体解释。

所以,DP过程一般为:对于每个节点x,先递归在它的每个子节点上进行DP,在回溯时,从子节点向节点x进行状态转移。

【与线性DP不同】

计算顺序不同。

线性dp有两种方向,顺推与逆推;而树形dp也有两个方向。由根到叶的先根遍历,但不常用,一般我们采用由叶到根的后根遍历,即子节点将有用信息传给父节点,逐层上推,最终由根得出最优解。

计算方式不同.   

线性的采用传统迭代,树形是用记忆化,用递归。

【过程】

1.判断是否是一道树规题:

即判断数据结构是否是一棵树,然后是否符合动态规划的要求。如果是,那么执行以下步骤,如果不是,那么换台。

2.建树:通过数据量和题目要求,选择合适的树的存储方式。

如果节点数小于5000,那么我们可以用邻接矩阵存储,如果更大可以用邻接表来存储(注意边要开到2*n,因为是双向的。这是血与泪的教训)。如果是二叉树或者是需要多叉转二叉,那么我们可以用两个一维数组brother[],child[]来存储(这一点下面会仔细数的)。

3.树规方程:通过观察孩子和父亲之间的关系建立方程。我们通常认为,树形DP的写法有两种:

a.根到叶子: 不过这种动态规划在实际的问题中运用的不多。

b.叶子到根: 既根的子节点传递有用的信息给根,完后根得出最优解的过程。这类的习题比较的多。

注意:这两种写法一般情况下是不能相互转化的。但是有时可以同时使用具体往后看。

【难点】

   1、和线性动态规划相比,树形DP往往是要利用递归的,所以对递归不熟悉的同学,是一道小小的障碍,说是小小的,因为要去理解也不难。

   2、细节多,较为复杂的树形DP,从子树,从父亲,从兄弟……已经一些小的要处理的地方,脑子不清晰的时候做起来颇为恶心

   3、状态表示和转移方程,也是真正难的地方。做到后面,树形DP的老套路都也就那么多,难的还是怎么能想出转移方程,状压DP、概率DP这些特别的DP应该说做到最后都是这样!

【经典例题】

 

一、三种基本模型

1. 树的最大独立集

定义 : 对于一颗n个节点的无根树,给出n-1条遍,选出尽量多的节点,使得任何两个节点均不相邻。输出一个最大独立集

思路 :  用d(i)表示以i为根结点的子树的最大独立集大小

对于结点i,只有两种选择,选或者不选,若选,则问题转化为求出i的孙子的d值之,若不选则转化为求i的儿子的d值之和,状态转移方程:d(i) = max(1 + gs[i], s[i])

     经典例题:

    洛谷 P1352 没有上司的舞会

2. 树的重心  

   定义 : 树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡

    思路 : 给定一颗无根树,将每一个点都设置为根,跑一下dfs,更新自己最大的子数具有的节点数(假定生成的子树中还包含祖先),在这些最大值中选取一个最小值,那个节点就是树的重心。

    经典 例题:

   POJ 1655 Balancing Act 树的重心

3. 树的最长路径

    定义 : 这棵树中距离最远的两个结点之间相隔的距离。注意:是任意两个结点的最远距离,不是树的深度

  经典例题:

  HDU 2196 Computer(树形DP) 入门模板

二、常规树形DP

洛谷 P1352 没有上司的舞会

  HDU 2196 Computer(树形DP) 入门模板

树形DP (cf 219D Choosing Capital for Treeland)树的最长路径应用

 

三、树形DP依赖背包

洛谷 P2014 选课 

洛谷 P2015 二叉苹果树

POJ1947Rebuilding Roads

 hdu1011Starship Troopers

The more, The Better

树形背包 POJ1155TELE

 

四、删点或删边树形DP

   POJ 1655 Balancing Act 树的重心

 

 

你可能感兴趣的:(模板,动态规划——树形DP)