- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
树形动态规划0.3
树形动态规划 什么是树型动态规划 树上没有环,所以dfs时不会有重复;n个点的树只有n-1条边。 顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向:向前和向后,相应的线性的动态规划有二种方法既逆推与顺推,而树型动态规划是建立在树上的,所以也相应的有二个方向: (1)根—叶:不过这种动态规划在实际的问题中运用的不多,也没有比较明显的例题,所以不在今天讨论的范围之内。 (2)叶-根:既根的子节点传递有用的信息给根,完后根得出最优解的过程。这类的习题比较的多,下面就介绍一些这类题目和它们的一般解法。 什么是树型动态规划 树形动态规划的题目需要先给出所有的边构造树,当然要使用尽量小的空间和时间,且一般将树转换成左儿子右兄弟的形式存储 (m叉树和森林转换为二叉树的方法),这是所有树形动态规划问题的基础。 因为树的定义和建立是递归的,所以,树形动态规划很少去划分阶段,更多的用的是记忆化搜索。 图论的权值都在边上,而树的权值一般都在点上,这一点需要好好思考。 加分二叉树 【问题描述】 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下: subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数 若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空 子树。 试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出; (1)tree的最高加分 (2)tree的前序遍历 【输入格式】 第1行:一个整数n(n<30),为节点个数。 第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。 【输出格式】 第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。 第2行:n个用空格隔开的整数,为该树的前序遍历。 【输入样例】 5 5 7 1 2 10 【输出样例】 145 3 1 2 4 5 分析 总结 输出因为要输出树的结构,所以,还要在动态规划的过程中,把每个区间的根给求出来。 设 root[I,j] 为第i个元素 到第j个元素的根。这样就可以确定树的结构了。 苹果二叉树 (apple) 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。?? 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。 输入格式 第1行2个数,N和Q(1=Q= N,1N=100)。N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。每根树枝上的苹果不超过30000个。 输出格式 一个数,最多能留住的苹果的数量。(剪枝时,千万不要连根拔起哦) 样例输入 5 21 3 11 4 102 3 203 5 20 样例输出 21 思考 这是一颗二叉树么? 这棵树如何来存储 有什么思路? 贪心是不是可以? 二叉苹果树的解决 此问题可以转化为: 对于一个二叉树,除了根节点外,每个节点都有相应的一个权值,在此基础上,求保留多少个点使得其仍然满足树的性质(树的性质有什么?)且权值最大,当然,根节点是必须保留的。 解决问题分两步:1) 建树 2)求最优解。 如何建树 数的定义本身就是递归定义。 那么我们也递归建树。 从根节点开始,每个结点最多有两个子节点,我们可以认为第一个子节点是左子树节点,第二个子节点是右子树节点。 具体代码如下。 Ch[v,1]为节点v的左子树,ch[v,2]为节点v的右子树。 Map为读入的边,类似于图的邻接矩阵。 建树的过程 procedure maketree(v:longint); var i:longint; begin for i:=1 to n do if map[v,i]=0 then begin ch[v,1]:=i; num[i]:=map[v,i];
文档评论(0)