浅谈树型动规划.doc

浅谈树型动规划.doc

ID:55566630

大小:79.00 KB

页数:13页

时间:2020-05-18

浅谈树型动规划.doc_第1页
浅谈树型动规划.doc_第2页
浅谈树型动规划.doc_第3页
浅谈树型动规划.doc_第4页
浅谈树型动规划.doc_第5页
资源描述:

《浅谈树型动规划.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、浅谈树型动态规划中山市华侨中学——李彦亭一、什么是树型动态规划顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向:1.根—>叶:不过这种动态规划在实际的问题中运用的不多,也没有比较明显的例题,所以不在今天讨论的范围之内。2.叶->根:既根的子节点传递有用的信息给根,完后根得出最优解的过程。这类的习题比较的多,下面就介绍一些这类题目和它们的一般解法。二、例题与解析加

2、分二叉树【问题描述】设一个n个节点的二叉树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的最

3、高加分(2)tree的前序遍历【输入格式】第1行:一个整数n(n<30),为节点个数。第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。【输出格式】第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。第2行:n个用空格隔开的整数,为该树的前序遍历。【输入样例】5571210【输出样例】14531245[分析]很显然,本题适合用动态规划来解。如果用数组value[i,j]表示从节点i到节点j所组成的二叉树的最大加分,则动态方程可以表示如下:value[i,j]=max{value[i,i]+value[i+1,j],

4、value[i+1,i+1]+value[i,i]*value[i+2,j],value[i+2,i+2]+value[i,i+1]*value[i+3,j],…,value[j-1,j-1]+value[i,j-2]*value[j,j],value[j,j]+value[i,j-1]}题目还要求输出最大加分树的前序遍历序列,因此必须在计算过程中记下从节点i到节点j所组成的最大加分二叉树的根节点,用数组root[i,j]表示[PASCAL源程序]{$N+}programNOIP2003_3_Tree;constmaxn=30;vari,j,n,d

5、:byte;a:array[1..maxn]ofbyte;value:array[1..maxn,1..maxn]ofcomp;root:array[1..maxn,1..maxn]ofbyte;s,temp:comp;f1,f2:text;fn1,fn2,fileNo:string;procedurepreorder(p1,p2:byte);{按前序遍历输出最大加分二叉树}beginifp2>=p1thenbeginwrite(f2,root[p1,p2],'');preorder(p1,root[p1,p2]-1);preorder(root[

6、p1,p2]+1,p2);end;end;beginwrite('InputfileNo:');readln(fileNo);fn1:='tree.in'+fileNo;fn2:='tree.ou'+fileNo;assign(f1,fn1);reset(f1);assign(f2,fn2);rewrite(f2);readln(f1,n);fori:=1tondoread(f1,a[i]);close(f1);fillchar(value,sizeof(value),0);fori:=1tondobeginvalue[i,i]:=a[i];{计算

7、单个节点构成的二叉树的加分}root[i,i]:=i;{记录单个节点构成的二叉树的根节点}end;fori:=1ton-1dobeginvalue[i,i+1]:=a[i]+a[i+1];{计算相邻两个节点构成的二叉树的最大加分}root[i,i+1]:=i;{记录相邻两个节点构成的二叉树的根节点;需要说明的是,两个节点构成的二叉树,其根节点可以是其中的任何一个;这里选编号小的为根节点,则编号大的为其右子树;若选编号大的为根节点,则编号小的为其左子树;因此,最后输出的前序遍历结果会有部分不同,但同样是正确的。如果最大加分二叉树的所有节点的度数都是0

8、或2,则最后输出的前序遍历结果是唯一的。}end;ford:=2ton-1dobegin{依次计算间距为d的两个节点构成的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。