2022年树形动态规划总结定义 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年树形动态规划总结定义 .pdf》由会员分享,可在线阅读,更多相关《2022年树形动态规划总结定义 .pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、树型动态规划的实例分析中山市华侨中学李彦亭一、什么是树型动态规划顾名思义, 树型动态规划就是在“树” 的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向:1 根 叶:不过这种动态规划在实际的问题中运用的不多,也没有比较明显的例题,所以不在今天讨论的范围之内。2 叶 根:既根的子节点传递有用的信息给根,完后根得出最优解的过程。这类的习题比较的多,下面就介绍一些这类题目和它们的一般解法。二、例题与解析加分二叉树【问题描述】设一个 n 个节点的二叉
2、树tree 的中序遍历为 (l,2,3,n) ,其中数字1,2,3,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为di, tree 及它的每个子树都有一个加分,任一棵子树subtree(也包含tree 本身)的加分计算方法如下:subtree 的左子树的加分 subtree 的右子树的加分subtree 的根的分数若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。试求一棵符合中序遍历为(1,2,3,n)且加分最高的二叉树tree。要求输出;(1) tree 的最高加分(2) tree 的前序遍历【输入格式】第 1 行:一个整数n(n
3、30) ,为节点个数。第 2 行: n 个用空格隔开的整数,为每个节点的分数(分数100) 。【输出格式】第 1 行:一个整数,为最高加分(结果不会超过4,000,000,000) 。第 2 行: n 个用空格隔开的整数,为该树的前序遍历。【输入样例】5 5 7 1 2 10 【输出样例】145 3 1 2 4 5 分析 很显然,本题适合用动态规划来解。如果用数组valuei,j 表示从节点i 到节点j 所组成的二叉树的最大加分,则动态方程可以表示如下:valuei,j=maxvaluei,i+valuei+1,j,valuei+1,i+1+valuei,i*valuei+2,j, 名师资料总
4、结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - valuei+2,i+2+valuei,i+1*valuei+3,j, ,valuej-1,j-1+valuei,j-2*valuej,j, valuej,j+valuei,j-1 题目还要求输出最大加分树的前序遍历序列,因此必须在计算过程中记下从节点i 到节点 j所组成的最大加分二叉树的根节点,用数组rooti,j 表示PASCAL 源程序 $N+ program NOIP2003_3_
5、Tree; const maxn=30; var i,j,n,d:byte; a:array1.maxnof byte; value:array1.maxn,1.maxnof comp; root:array1.maxn,1.maxnof byte; s,temp:comp; f1,f2:text;fn1,fn2,fileNo:string; procedure preorder(p1,p2:byte); 按前序遍历输出最大加分二叉树 begin if p2=p1 then begin write(f2,rootp1,p2, ); preorder(p1,rootp1,p2-1); preor
6、der(rootp1,p2+1,p2); end; end; begin write(Input fileNo:);readln(fileNo); fn1:=tree.in+fileNo;fn2:=tree.ou+fileNo;assign(f1,fn1);reset(f1); assign(f2,fn2);rewrite(f2); readln(f1,n); for i:=1 to n do read(f1,ai); close(f1); fillchar(value,sizeof(value),0); for i:=1 to n do begin valuei,i:=ai;计算单个节点构成
7、的二叉树的加分 rooti,i:=i; 记录单个节点构成的二叉树的根节点 end; for i:=1 to n-1 do begin valuei,i+1:=ai+ai+1;计算相邻两个节点构成的二叉树的最大加分 rooti,i+1:=i;记录相邻两个节点构成的二叉树的根节点;需要说明的是, 两个节点构成的二叉树, 其根节点可以是其中的任何一个;这里选编号小的为根节点,则编号大的为其右子树; 若选编号大的为根节点,则编号小的为其左子树;因此, 最后输出的前序遍历结果会有部分不同,但同样是正确的。如果最大加分二叉树的所有节点的度数都是0 或 2,则最后输出的前序遍历结果是唯一的。 名师资料总结
8、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - end; for d:=2 to n-1 do begin 依次计算间距为d 的两个节点构成的二叉树的最大加分 for i:=1 to n-d do begin s:=valuei,i+valuei+1,i+d;计算以 i 为根节点,以i+1 至 i+d 间所有节点为右子树的二叉树的最大加分 rooti,i+d:=i; 记录根节点i for j:=1 to d do begin temp:=v
9、aluei+j,i+j+valuei,i+j-1*valuei+j+1,i+d;计算以 i+j 为根节点,以i 至i+j-1 间所有节点为左子树,以i+j+1 至 i+d 间所有节点为右子树的二叉树的最大加分 if temps then begin 如果此值为最大 s:=temp;rooti,i+d:=i+j;记下新的最大值和新的根节点 end; end; temp:=valuei,i+d-1+valuei+d,i+d;计算以 i+d 为根节点, 以 i 至 i+d-1 间所有节点为左子树的二叉树的最大加分 if temps then begin s:=temp;rooti,i+d:=i+d+
10、1; end; valuei,i+d:=s; end; end; writeln(f2,value1,n:0:0);输出最大加分 preorder(1,n); 输出最大加分二叉树的前序遍历序列 close(f2); end. 点评 基本题。考查了二叉树的遍历和动态规划算法。难点在于要记录当前最大加分二叉树的根节点。疑点是最大加分二叉树的前序遍历序列可能不唯一。Ps:其实这题真正意义上来说还是一道普通的dp 题目,但它批上了树的外表,所以都拿来作对比和讨论,解题报告出自湖北省水果湖高中伍先军 写的 第九届全国青少年信息学奥林匹克联赛( N0IP2003 )复赛提高组解题报告。Ural 1018
11、二*苹果树题目有一棵苹果树,如果树枝有分叉,一定是分2 叉(就是说没有只有1 个儿子的结点)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N, 树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4 个树枝的树 2 5 / 3 4 / 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹
12、果。输入格式第 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 解析:因为题目一给出就是二叉的,所以很容易就可以写出方程:a(I,j):=max(a(i.left,k)+a(i.right,j-k),0=kj then j:=k; end; treedp:=j; End;
13、选课 问题描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - 课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课, 每门课有个学分,每门课有一门或没有直接先修课(若课程a 是课程 b 的先修课即只有学完了课程a,才能学习课程b) 。一个学生要从这些课程里选择M门课程学习, 问他能获得的最大学分是多少?输入:第一行有
14、两个整数N,M用空格隔开。(1=N=200,1=M=150) 接下来的N 行, 第 I+1 行包含两个整数ki和 si, ki表示第 I 门课的直接先修课,si表示第 I门课的学分。若ki=0 表示没有直接先修课(1=ki=N, 1=si=0 then exit; treedp(ax.r,y); 只有右子树的情况 j:=bax.r,y; for k:=1 to y do 左右子树都有的情况 begin treedp(ax.l,k-1); treedp(ax.r,y-k); i:=bax.l,k-1+bax.r,y-k+ax.k; if ij then j:=i; end; bx,y:=j; e
15、nd; begin readln(s); assign(input,s);reset(input); readln(n,m); fillchar(f,sizeof(f),0); for i:=0 to n do begin ai.l:=-1;ai.r:=-1;ai.k:=-1;end; build tree for i:=1 to n do begin readln(k,l); ai.k:=l; if fk=0 then ak.l:=i else afk.r:=i; fk:=i; end; bianjie for i:=-1 to n do for j:=-1 to m do if (i=-1
16、) or (j=0) then bi,j:=0 else bi,j:=-1; tree dp treedp(a0.l,m); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - output writeln(ba0.l,m); end. Tju1053 技能树Problem 玩过 Diablo的人对技能树一定是很熟悉的。一颗技能树的每个结点都是一项技能,要学会这项技能则需要耗费一定的技能点数。只有学会了某一项技能以后,才能继续学习
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年树形动态规划总结定义 2022 树形 动态 规划 总结 定义
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内