P1040 加分二叉树
转自:(http://www.cnblogs.com/geek-007/p/7197439.html)
经典例题:加分二叉树(Luogu 1040)
设一个 n 个节点的二叉树 tree 的中序遍历为( 1,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 的前序遍历:
- 5 7 1 2 10
- 答案 1: 145
- 答案 2: 3 1 2 4 5
设 F[i][j] 为只用第 i 个数到第 j 个数构成的加分树的最大权值。下图为样例解释:
牢记一个二叉树的性质:中序遍历时候,左右子树一定在根节点左右两边
* 枚举根节点,这样就化成了左子树和右子树的问题,求最优解即可。
* F[i][j] = MAX ( F[i][k-1] * F[k+1][j] + A[k] )(左×右+根k自己本身权值)
//T25:加分二叉树
;i<=n;++i) f[i][i]=a[i];//赋初值(只有一个叶子节点,根就是自己)
;i<=n;++i) f[i+][i]=;
;k<n;++k)
;i+k<=n;++i)
{
int j=i+k;
]*f[l+][j]+a[l]);//枚举根节点
}
][n];
* 问题: 如何求出树的前序遍历(树的形态)?
我们另外记录一个辅助数组 G[i][j],代表 F[i][j] 取最大值的时候,根节点是什么,这样就可以通过递归来求出树的前序遍历。
;i<=n;++i) f[i][i]=a[i],g[i][i]=i;//边界值(只有一个叶子节点,根就是自己)
;i<=n;++i) f[i+][i]=;//预处理空节点,保证不出错,一个根节点没有左子树,把左子树标记为1
;k<n;++k)//k:区间长度
;i+k<=n;++i)
{
int j=i+k;//j:末尾节点
for(int l=i;l<=j;++l)
{
]*f[l+][j]+a[l];
if(t>f[i][j])//记录最优的根
{
f[i][j]=t;
g[i][j]=l;
}
}
}
//T25:加分二叉树
//递归输出x到y这个树的前缀遍历
void dfs(int x,int y)
{
if(x>y) return;
int l=g[x][y];//l为根
cout<<l<<" ";//先输出l
/*=====================*///再输出子树的值
dfs(x,l-);//左
dfs(l+,y);//右
/*=====================*/
}
...
//输出答案——整棵树
dfs(,n);
P1040 加分二叉树的更多相关文章
- 【洛谷】P1040 加分二叉树
[洛谷]P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数 ...
- 洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 洛谷 P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- P1040 加分二叉树 区间dp
题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...
- 洛谷P1040 加分二叉树【记忆化搜索】
题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...
- luogu P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- [NOIP2003] 提高组 洛谷P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
随机推荐
- IOC杂谈(一)初识IOC
初衷 发现学习东西不单只是看,用,还有很重要一点就是记录,不然过个几个月再用到相同的知识时,你会发现你已经丢得差不多了,故此开始在博客园记录的同时也与各位同行分享知识. 正题 关于IOC,在刚工作时就 ...
- Django Web框架入门
一.Django介绍 Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很 ...
- MongoDB关系与数据库引用
MongoDB关系: MongoDB 的关系表示多个文档之间在逻辑上的相互联系.文档间可以通过嵌入和引用来建立联系. 1. 嵌入关系: 形式:把一个文档嵌入到另一个文档中. 优点:数据保存在单一的文档 ...
- shell 组合新的变量名
shell 组合新的变量名 普通变量 name=yushuang var=name # 要获取到yushuang res=`eval echo '$'"$var"` echo $r ...
- 计蒜之道 初赛第一场B 阿里天池的新任务(简单)
阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 tt,判断它在另一个根据规则生成的 DNA 碱基序列 ss 中出现了多少次. 首先,定义一个序列 ww: \displ ...
- MSSQL 备份数据库还原
-- 完整还原RESTORE DATABASE XXXX FROM DISK = 'd:\XXXX.bak' WITH MOVE 'XXXX' TO 'D:\MSSQL\Data\XXXX.mdf', ...
- webapp通用选择器:iosselect
1,这个组件解决什么问题 在IOS系统中,safari浏览器的select标签默认展示样式和iOS-UIPickerView展示方式一致,形如下图: 这个选择器操作方便,样式优美.但是在安卓系统中展示 ...
- Vue.js—组件快速入门以及实例应用
上次我们学习了Vue.js的基础,并且通过综合的小实例进一步的熟悉了Vue.js的基础应用.今天我们就继续讲讲Vue.js的组件,更加深入的了解Vue,js的使用.首先我们先了解一下什么是Vue.js ...
- HTTP协议相关知识点
主要参考 http://www.imooc.com/article/14397,来源:慕课网,作者种子_fe HTTP是超文本传输协议,主要特点有: 支持客户.服务器模式 简单快速:客户向服务器请求服 ...
- eclipse构建maven+scala+spark工程
前提条件 下载安装Scala IDE build of Eclipse SDK 构建工程 1.新建maven工程 2.配置项目信息 3.新建scala对应的Source Folder 4.添加scal ...