- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划专题(六):树型动态规划
(重庆巴蜀中学 黄新军)
信息学竞赛中通常会出现这样的问题:给一棵树,要求以最少的代价(或取得最大收益) 完成给定的操作。有很多问题都是在树和最优性的基础上进行了扩充和加强,从而变成了棘 手的问题。这类问题通常规模较大,枚举算法的效率无法胜任,贪心算法不能得到最优解, 因此要用动态规划解决。
和一般动态规划问题一样,这类问题的解决要考虑如下三步:
1、确立状态:几乎所以的问题都要保存以某结点为根的子树的情况,但是要根据具体问题考虑是否要加维,加几维,如何加维。
2、状态转移:状态转移的变化比较多,要根据具体问题具体分析,这也是本文例题分析的重点。
3、算法实现:由于树的结构,使用记忆化搜索比较容易实现。
由于模型建立在树上,即为树型动态规划。
【例题 1】二叉苹果树
【问题描述】
有一棵苹果树,如果树枝有分叉,一定是分2 叉(就是说没有只有 1 个儿子的结点),这棵树共有N 个结点(叶子点或者树枝分叉点),编号为 1-N,树根编号一定是 1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 4 个树枝的树:
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。
【文件输入】
第 1 行 2 个数,N 和Q(1=Q=N,1N=100)。N 表示树的结点数,Q 表示要保留的树枝数量。接下来N-1 行描述树枝的信息。每行 3 个整数,前两个是它连接的结点的编号。第 3 个数是这根树枝上苹果的数量。 每根树枝上的苹果不超过 30000 个。
【文件输出】
输出文件仅一个数,表示最多能留住的苹果的数量。
【样例输入】
5 2
1 3 1
1 4 10
2 3 20
3 5 20
【样例输出】21
【思路点拨】
由题意可知,需要保留的树枝数量为Q 条,即保留结点 t=Q+1 个。树根必须保留,可以分三种情况讨论保留苹果的最大数。
①树根的左子树为空,全部保留右子树,右子树中保留t-1 个结点;
②树根的右子树为空,全部保留左子树,左子树中保留t-1 个结点;
③树根的两棵子树都为非空,设左子树保留k 个结点,则右子树保留t-k-1 个结点。要得到保留树根时的苹果最大数,只需要求上述三个方案中的最大值。设树根为V,左
儿子为ch[v,1],右儿子为ch[v,2],对于①方案,要取得该方案的最大值,需要取得以 ch[v, 2]为根,保留t-1 个结点的最大值。这时同样具有上述三种方案。其他②③情况同理;由此可以看出,该问题具有明显的最优子结构性质,每个问题都与左右儿子结点有关系,但不与 孙子结点发生关系,具备无后效性;且计算方案时,搜索子结构时具备重叠性,所以可以用 动态规划来解决。
阶段和状态:f[v,t]:表示以 v 为根的树上保留t 个节点的最大权值和。设 ch[v,1],ch[v, 2]分别存v 节点的左右孩子。
状态转移方程:
f[v,t]=max{f[ch[v,1]][i]+f[ch[v,2]][t-i-1]+num[v]}(0=i=t-1)
初始化:f[v,t]=0,(t=0);
f[v,t]=num[v];(ch[v,1]=0 且 ch[v,2]=0) Answer=f[1,t];
【问题描述】
【例题 2】加分二叉树(NOIP2003)
设一棵n 个结点的二叉树tree 的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n 为结点编号。每个结点都有一个分数(均为正整数),记第 i 个结点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树subtree(也包含tree 本身)的加分计算方法如下:
subtree 的左子树的加分×subtree 的右子树的加分+subtree 的根的分数
若某个子树为空,规定其加分为1,叶子的加分就是叶结点本身的分数。不考虑它的空子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
tree 的最高加分
tree 的前序遍历
【输入格式】
第 1 行:一个整数n(n30),为结点个数。
第 2 行:n 个用空格隔开的整数,为每个结点的分数(分数100)。
【输出格式】
第 1 行:一个整数,为最高加分(结果不会超过4,000,000,000)。第 2 行:n 个用空格隔开的整数,为该树的前序遍历。
【输入样例】
5
5 7 1 2 10
【输出样例】
145
3 1 2 4 5
【思路点拨】
本题已经说明了问题的模型是一棵树,而且是一棵中序遍历为1,2,3,…,n 的二叉树。而对于一棵中序遍历为 1,2,3,…,n 的二叉树有很多种形式,对于样例,下图就列出了 3 种形式, 而按题意,第三种形式得到的得分最大。
性质:中序
文档评论(0)