【原题】【noip 2003 T2】【动态规划】加分二叉树

问题

描述 Description

设一个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的最高加分
(2)tree的前序遍历

输入格式 Input Format

第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。

输出格式 Output Format

第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。

 

分析

一看就是一道动态规划,而且是树形的。仔细分析题意我们发先中序遍历的遍历顺序是——左根右。也就是说,一旦根的位置在一个中序遍历之中确定,它的左边的序列就是它的左子树,右边就是右子树。那么整棵树的最优值就是左子树的最优值乘上右子树的最优值。

我们可以得到方程:f[i,j]表示中序遍历中i~j这棵子树能得到的最大加分 f[i,j]=max{f[i,k-1]*f[k+1,j]+f[k,k]}(i<=k<=j)方程一定要这么写,因为我们要考虑子树为空的情况,所以i到j中的任意一个点都可以作为这棵树的根。循环时要先循环区间长度l,这就类似于区间类的动态规划了,为什么呢。因为对于一个树形的动态规划,都是从下至上的。所以要先找到叶子节点,再逐层找到根节点。

边界处理:将所有空子树的值都赋为1。

反思

方程的正确性直接影响结果。有的时候方程不能改动,根题目的要求和数据结构有关,要保证方程的正确性,保证每一步的最优性。不同类型的动态规划有相同的地方,其宗旨是无后效性和子结构最优性。

code

program liukee;
varpath,f:array[0..50,0..50] of longint;i,n,j,k,l:longint;procedure outit(x,y:longint);
beginif x>y then exit;write(path[x,y],' ');outit(x,path[x,y]-1);outit(path[x,y]+1,y);
end;beginfilldword(f,sizeof(f)>>2,1);readln(n);for i:=1 to n dobeginread(f[i,i]);path[i,i]:=i;end;for l:=2 to n dofor i:=1 to n-1 dobeginj:=i+l-1;for k:=i to j doif f[i,k-1]*f[k+1,j]+f[k,k]>f[i,j] thenbeginf[i,j]:=f[i,k-1]*f[k+1,j]+f[k,k];path[i,j]:=k;end;end;writeln(f[1,n]);outit(1,n);
end.

转载于:https://www.cnblogs.com/liukeke/archive/2010/11/16/1878515.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HRegionServer上工作组件汇总

HRegionServer上工作组件汇总&#xff0c;近期推出&#xff01;

发现在创建云服务器ecs实例的磁盘快照时_玩转ECS第7讲|ECS数据保护-数据备份新特性与最佳实践...

简介&#xff1a; 本文中&#xff0c;阿里云智能弹性计算专家余初武(悟元)将结合阿里云近期推出的数据备份新特性(快照极速备份、一致性快照组)来介绍云上环境如何做数据备份的最佳实践&#xff1b;适合需要构建云上架构的工程师&#xff0c;架构师和云上实施从业人员收看。关键…

用Ant编译Flex项目的几点注意事项

1. 往mxmlc中用define添加编译参数的时候特别要注意一点&#xff0c;字符串一定要包含在单引号中。 下面的写法是无法通过的&#xff1a; <mxmlc ...><define name"NS::NAME" value"Flex in air"/> </mxmlc>下面的写法才是正确的&#x…

链表打印从尾到头打印链表

在本文中,我们主要介绍链表打印的内容,自我感觉有个不错的建议和大家分享下 每日一道理 生命不是一篇"文摘"&#xff0c;不接受平淡&#xff0c;只收藏精彩。她是一个完整的过程&#xff0c;是一个"连载"&#xff0c;无论成功还是失败&#xff0c;她都不会…

1、EJB基本概念及运行环境

1、EJB是什么&#xff1f; EJB是一个用于分布式业务应用的标准服务端组件模型。采用EJB构架编写的应用是可伸缩的、事务性的、多用户安全的。采用EJB编写的应用可以部署在任何支持EJB规范的服务器平台上&#xff0c;例如&#xff1a;jboss、weblogic。 2、EJB是用来干什么的&am…

二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法

今天是周四高等数学专题的第7篇文章。之前的文章和大家聊了许多数学上的理论&#xff0c;今天和大家聊点有用的东西。我们都知道&#xff0c;工业上的很多问题经过抽象和建模之后&#xff0c;本质还是数学问题。而说到数学问题就离不开方程&#xff0c;在数学上我们可以用各种推…

关于android开发环境的创建

最近想暑假找个实习单位&#xff0c;想想java android方面的应该比c、C要好点&#xff0c;然后就想重操旧业学习android 大三的时候我学过一个学期的android知识。当时创建开发环境我很快就弄好了&#xff0c;但是环境创建险些让我崩溃。 环境搭建包括四步&#xff1a; 1、JDK安…

getchar()和EOF总结

大师级经典的著作&#xff0c;要字斟句酌的去读&#xff0c;去理解。以前在看K&R的The C Programming Language(SecondEdition) 第1.5节的字符输入/输出&#xff0c;被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必…

Android多种View动画:EasyAndroidAnimations

&#xfeff;&#xfeff;Android多种View动画&#xff1a;EasyAndroidAnimations EasyAndroidAnimations是Android的一个动画库&#xff0c;使用起来简单方便&#xff0c;EasyAndroidAnimations将一个Android View以各种形式的动画动起来。 其中如图&#xff1a; EasyAndroidA…

python中configparser详解_Python中的ConfigParser模块使用详解

1.基本的读取配置文件-read(filename) 直接读取ini文件内容-sections() 得到所有的section&#xff0c;并以列表的形式返回-options(section) 得到该section的所有option-items(section) 得到该section的所有键值对-get(section,option) 得到section中option的值&#xff0c;返…

关于ubuntu无法启动nginx的问题

在ubuntu13.04上使用apt方式安装nginx发现无法启动nginx&#xff0c;也不报错 查看nginx运行状态&#xff0c;显示未启动 搜索无果&#xff0c;想起了原来的遇到的一个问题&#xff0c;那时候是安装了nginx和lighthttpd服务器&#xff0c;导致nginx无法启动的情况&#xff0c;提…

MVC中validateRequest=false不起作用

MVC Request.QueryString 客户端 潜在危险 在MVC中如果传递xml等参数时&#xff0c;会报“从客户端中检测到有潜在危险的Request.QueryString值”的错误&#xff0c;无法提交参数&#xff0c;在web.Config的Pages节点或者aspx页面中添加validateRequest"false"貌似不…

C语言之基本算法32—鞍点

//数组/*题目&#xff1a;求随意矩阵的全部鞍点。并统计个数。&#xff08;在矩阵中&#xff0c;一个数在所在行中是最大值&#xff0c; 在所在列中是最小值。则被称为鞍点。&#xff09; 如&#xff1a; 1 2 34 5 6 7 8 9 当中&#xff0c;a[1][3]3是该矩阵唯一的…

django python3.6_Django+mysql+python3.6.5 Windows

1.下载py365https://www.python.org/downloads/windows/(原来有2.7.x版本 直接修改环境变量即可&#xff0c;需要多个python环境可以使用pyevn)2.安装mysql2.1下载https://dev.mysql.com/downloads/mysql/5.7.html#downloads解压&#xff1a;mysql-5.7.22-winx642.2配置环境变量…

STL - 底层实现

一、STL六大组件1&#xff09;容器&#xff08;Container&#xff09;2&#xff09;算法&#xff08;Algorithm&#xff09;3&#xff09;迭代器&#xff08;Iterator&#xff09;4&#xff09;仿函数&#xff08;Function object&#xff09;5&#xff09;适配器&#xff08;A…

Oracle以SQL方式导出导入(转移)数据

为什么80%的码农都做不了架构师&#xff1f;>>> 导出源数据 源数据库为Oracle 9g使用SQL Developer导出数据库的表结构和数据&#xff0c;导出成sql文件。这里的源Oracle和目标Oracle的编码是否相同&#xff0c;如果表字段里有时间类型的那么还要注意两库的日期格式…

产品经理应该干些啥?

产品经理的工作&#xff0c;总结起来就三件事&#xff1a; 1、知道做什么 2、知道怎么做 3、让别人去做 先来看“知道做什么”。 许多产品经理其实不知道该做什么&#xff0c;整日被动的应付上面安排下来的工作&#xff0c;一旦出现工作的断顿&#xff0c;就会感觉无所事…

oppo售后解锁恢复工具.zip_OPPO手机4个不为人知的小技巧,全知道的竟然不到1%,令人唏嘘...

随着科技的发展速度加快&#xff0c;智能手机产品也越做越高端。手机里面也包含着很多很实用的技巧&#xff0c;却没有多少人知道&#xff0c;简直就是白白的浪费呀&#xff01;应用分屏一个很好用的功能&#xff0c;利用它我们可同时进行两种操作&#xff0c;比如&#xff1a;…

matlab中方波信号的谐波表示

matlab中方波信号的谐波表示 一.数学运算 二.matlab代码 t-7:0.001:7; %x(t)中t取值范围为【-7,7】 T11; T4; w2*pi/T; a02*T1/T; Ninput(请输入谐波数); Xta0*ones(1,length(t)); for k1:NXtXt2*a0*sinc(k*a0)*cos(k*w*t); end plot(t,Xt);三.运行结果 四。结论 很明显…

C语言学习笔记三

// C 学习笔记//日期&#xff1a;2013-5- 主讲&#xff1a;//记录&#xff1a;ant //备注&#xff1a;课堂学习笔记//// switch ... case语句也可以用来实现分支的处理&#xff0c;使用方法如下 switch(表达式&#xff09; { …