树形DP初探•总结
这几天,我自学了基础的树形DP,在此给大家分享一下我的心得。
首先,树形DP这种题主要就是解决有明确分层次且无环的树上动态规划的题。这种题型一般(注意只是基础、普通的情况下)用深度优先搜索来解决实际的DP部分,而且一般用记忆化搜索,因为树会有重复遍历节点的情况。在一棵树上针对普遍子树都满足根节点与两个子节点有特殊关系的,树形DP就应该是解决这道题的优选方法了。
讲完基础的定义,我们来讲几个挺有用的性质:
1、在一棵二叉树上,已知其中序遍历,它的任一个节点都可以成为它的根节点,对于每一个子树都成立。
2、在二叉树上任一个节点出发,都能遍历每一个位置。而且每个节点与另一个节点只有一条枝条连通。
3、树中一定无环。
4、多叉树转变成的二叉树中,原来的兄弟节点的兄弟还是自己的兄弟,孩子的孩子也还是自己的孩子的孩子,但是兄弟的孩子与自己无关,而且兄弟和自己是具有同等发展机会的。
5、树是具有递归性质的,无论是建树还是遍历,递归都有效。
6、……
各位大神如果有什么好的性质可以补充的话,欢迎在评论中补充。
接下来,这个存储树的方式也很讲技巧。判断节点数多不多,很少的话建议用邻接矩阵。
假如边数太多的话而且边与边之间联系比较大的话,建议用邻接表(链式前向星,数据大小要开2*n)。或者还可以用专门存树的各种方法,例如树根孩子表示法,双亲表示法,孩子兄弟表示法(重点)……
最后讲讲做这种题的步骤:
1、读题,分析。判断这道题到底是不是树形DP,还是披着树的外套的普通区间DP,还是其他树的问题。假如不是,马上找其他的方法。
2、想想怎么建树。首先该用什么来存储,判断这是一棵怎样的树。是单纯二叉树呢,或者单纯多叉树,还是多叉树转二叉树呢,这都需要经验判断,不同的题不一样。建树的过程可以用一个DFS(普通二叉树),也可以用建图的方法(多叉树),还可以用brother和child的方法(多叉转二叉)。
3、列出状态转移方程,并且用记忆化搜索来实现。选择返不返回值的时候因情况而定。
4、检查边界情况和初始化够不够周全,通常会在这里失分。还要想想有没有必要优化和有没有优化的方法,例如用指针存储等等。
讲几道例题:
1、加分二叉树
这道题分析后发现它并不是树形DP,只是有树的外形的区间DP,所以不满足第一步判断,撤。不过他的输出先序遍历还是挺值得理解一下的。
详情请看:http://www.cnblogs.com/Ronald-MOK1426/p/8445336.html
2、二叉苹果树
这道题是最基础的二叉树版树形DP。他用树根孩子表示法,很简单解决。
注意建树的时候记得删边,而且最后输出的是q+1。
详情请看:http://www.cnblogs.com/Ronald-MOK1426/p/8446738.html
3、最大利润
这道题是我们学校初三的一位大佬推荐的,尽管我们并没有做过(是JZOJ的题),但是也是多叉树中的一道好题。注意是双向边。有兴趣的同学可以去搜一下。
4、没有上司的舞会
这道题也是多叉树的一道经典题目,经过无数次改编。要用邻接表来储存。但是要注意初始化的时候小心点。后面用取点还是不取点的方法取到最大值。
详情请看:http://www.cnblogs.com/Ronald-MOK1426/p/8449790.html
5、选课
这道题是一道多叉树转二叉树的经典题。要用孩子兄弟表示法来存储。是一道有依赖性的问题。我比较看好他的改编版,要是我们要输出取了那些课程,那么这道题就变难了许多。我们可以通过原路返回的思想,一路找回相等的数值,那么就可以推出答案。同时也可以边记忆化搜索边推答案。
详情请看:http://www.cnblogs.com/Ronald-MOK1426/p/8448397.html
6、软件安装
这道题是选课的一个升级版,假如大家对选课非常熟悉和理解透彻的话,相信理解起来不是问题。但是初始化有点麻烦。
因为题目的意思是可能会出现互相依赖的情况,所以这道题是有环的。所以我们就要加入判环和缩点两个步骤。把判出来的环缩成一个新点。之后就和选课别无他样了。
详情请看:http://www.cnblogs.com/Ronald-MOK1426/p/8449686.html
说了这么多,总结一下。
这只是基础的树形DP,往下学肯定有各种的优化,本人在此先不作讲解,水平有限,见谅。
要是算过内存或者数组会爆的话,可以用链表、指针来优化一下存储的环节。
记忆化搜索部分一定要注意边界条件,否则会出错。
最后,讲一个自己总结的树形DP的套路。要是我们判断了一道题是树形DP,那么一般只可能3种存储:邻接矩阵、邻接表、孩子兄弟。然后记忆化部分就是简单的判断有无出现过,到边界了没有,假如都不满足,就搜索下一层,通过不断减少体积(分体积)的方法求出最值。(普通DP的基本操作)
请各位大神指正,谢谢大家!
树形DP初探•总结的更多相关文章
- 树形动态规划(树形DP)入门问题—初探 & 训练
树形DP入门 poj 2342 Anniversary party 先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
随机推荐
- 【第二周】Java实现英语文章词频统计
1.需求:对于给定的英文文章进行单词频率的统计 2.分析: (1)建立一个如下图所示的数据库表word_frequency用来存放单词和其对应数量 (2)Scanner输入要查询的英文文章存入Stri ...
- CentOS安装crontab及使用方法(转)
CentOS安装crontab及使用方法(转) 安装crontab:[root@CentOS ~]# yum install vixie-cron[root@CentOS ~]# yum ins ...
- win7仿win98电脑主题
http://ys-d.ys168.com/599631823/S7hMfgo3M382J764IOJ8/plus98_for_windows_7_by_ansonsterling.zip
- excel copy cell & batch operation & checkbox
excel copy cell & batch operation & checkbox excel 右下角,下拉/双击 (复制 cell) 注意: 不是选择列
- CSS预处理语言-less 的使用
Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. Less 可以运行在 Node 或浏览器端. Less的编译处理 作为一 ...
- BZOJ4898/5367 Apio2017商旅(分数规划+floyd)
如果要在某点买入某物品并在另一点卖出,肯定是走其间最短路径.于是预处理任意两点间的收益和最短路径,连完边二分答案判负环即可,可以全程floyd.注意inf大小. #include<iostrea ...
- Contest 3
A:非常裸的dp. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin ...
- QoS专题-第1期-QoS理论篇
QoS理论篇 1 QoS的产生 随着网络技术的飞速发展,IP网络已经从当初的单一数据网络向集成数据.语音.视频.游戏的多业务网络转变.网络中所承载的数据呈几何级倍数增长,而且这些业务对网络带 ...
- 深入理解JVM一JVM内存模型
前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 一.运行流程 我 ...
- [洛谷P4626]一道水题 II
题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...