加分二叉树(洛谷-P1040)
题目描述
设一个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的前序遍历
输入输出格式
输入格式:
第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
输出格式:
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。
输入输出样例
输入样例#1:
5
5 7 1 2 10
输出样例#1:
145
3 1 2 4 5
源代码
#include<iostream>
using namespace std;int dp[35][35],pre[35][35];
void print(int l,int r);int main()
{int n;int score[31];int len,i,j,k;int x;cin>>n;//输入节点数for(i=1;i<=n;i++)//输入节点分数cin>>score[i];for(i=1;i<=n;i++){dp[i][i]=score[i];//存储子树的最大加分pre[i][i]=i;//存储根节点}for(len=1;len<=n;len++)//len:子树结点数{for(i=1;i+len<=n;i++)//子树最左端的结点 {j=len+i;//子树最右端的结点 x=score[j]+dp[i][j-1];//j加仅一棵子树的情况 dp[i][j]=score[i]+dp[i+1][j];//i加仅一棵子树的情况 pre[i][j]=i;if(dp[i][j]<x){dp[i][j]=x;pre[i][j]=j;}for(k=i+1;k<j;k++)//两棵子树的情况,k:根节点 {x=score[k]+dp[i][k-1]*dp[k+1][j];if(dp[i][j]<x){dp[i][j]=x;pre[i][j]=k;}} }}cout<<dp[1][n]<<endl;//输出最高加分print(1,n);//输出前序return 0;
}void print(int l,int r)
{if(l>r)return;cout<<pre[l][r]<<" ";//根结点输出if(l==r) return;print(l,pre[l][r]-1);print(pre[l][r]+1,r);
}
加分二叉树(洛谷-P1040)相关推荐
- 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树
[题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 二叉树——新二叉树(洛谷 P1305)
题目选自洛谷P1305 这篇用来二叉树入门,讲述遍历二叉树的基本过程代码, 新二叉树只是洛谷的题目叫这个. 对于该题,我们用一个结构体node来表示树的每个结点,这个结构体数组tree来代表一棵树. ...
- 洛谷P1040 加分二叉树运用区间DP(动态规划)求解
首先放上原题链接 点我,点我进入原题 什么是动态规划? 在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.而且每次求出的解不是独立的,我们需要逐层推出最优解. 以这 ...
- 二叉树——二叉树问题(洛谷 P3884)
题目选自洛谷P3884 ** 解题思路** 经过剖析样例,我微微思索手动模拟后发现 要找最近的公共祖先,一次次地向上找就好了嘛,其实这有点并查集地意思 寻找时可分为两种情况 1.两点在不同子树中,有公 ...
- 二叉树——求先序排列(洛谷 P1030)
题目选自洛谷P1030 首先,一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D). 因为题目求先序,意味着要不断找根. 那么我们来看这道题方法:(示例) 中序ACGDBHZKX ...
- 二叉树——医院设置(洛谷 P1364)
题目选自洛谷P1364 从指定结点开始,使用DFS,对于某个结点来说,搜索的深度就是源点到这个结点的距离,单点贡献(该点所有居民到医院的距离之和)就是源点到这个结点的距离乘上该点的居民数量:然后加上自 ...
- 二叉树——美国血统(洛谷 P1827)
题目选自洛谷P1827 根据前序.中序遍历求出后序遍历,这也是二叉树很重要且基本的知识,还是有必要练练. 至于什么是前.中.后序遍历,这里就不再过多讲述. 用手模拟求解是简单的,接下来看看如何用代码来 ...
- 二叉树——二叉树的深度(洛谷 P4913)
题目选自洛谷P4913 题目描述 给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 1),如果是叶子节点,则输入0 0.建好树后希望知道这棵二叉树的深度.二叉树的深度是指从根节点到叶子结点时,最多 ...
最新文章
- SAP RETAIL初阶MM41创建商品主数据BASIC DATA里的Valuation Class
- linux 继续编译,【编译】Linux环境编译traceroute
- Linux系统编程(六)守护进程
- 《TCP/IP详解》学习笔记(七):广播和多播、IGMP协议
- 5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...
- 微信小程序侧边栏滑动特效(左右滑动)
- 允许远程访问MySQL的设置
- 网络工程师成长日记368-榆林通信大楼项目回忆录
- hdu 3501(欧拉函数)
- OC基础--关键字@property 和 @synthesize
- DNS与NS、NS记录
- 单件模式(Singleton Pattern
- 计量经济学学习笔记:多重共线性、异方差、自相关
- 调整图像亮度之 线性拉伸 (2) 百分比截断拉伸
- 2020,网络工程师的就业前景怎么样?
- 拓嘉启远:拼多多虚拟产品相关分享
- 【数据结构--静态链表】
- 从零开始学习Linux运维,成为IT领域翘楚(三)
- Flutter的配置
- SQLServer数据库mdf文件中了勒索病毒firex3m,扩展名变为mdf.firex3m
热门文章
- 院士怒批:中国科研被SCI和西方支配,贫于创新、贫于思想
- python上传文件 request_Python request post上传文件常见要点
- JDK 18 / Java 18 GA 发布
- 抢了个票,还以为发现了12306的系统BUG
- Java 数组转 List 的三种方式及对比
- 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了
- 文言文能编程了,是噱头还是突破?
- UI标签库专题三:JEECG智能开发平台 FormValidation(表单提交及验证标签)
- stone 的 log4j配置详解
- 架构设计 | 分布式系统调度,Zookeeper集群化管理