题目描述

设一个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)相关推荐

  1. 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树

    [题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...

  2. [洛谷P1040] 加分二叉树

    洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...

  3. 二叉树——新二叉树(洛谷 P1305)

    题目选自洛谷P1305 这篇用来二叉树入门,讲述遍历二叉树的基本过程代码, 新二叉树只是洛谷的题目叫这个. 对于该题,我们用一个结构体node来表示树的每个结点,这个结构体数组tree来代表一棵树. ...

  4. 洛谷P1040 加分二叉树运用区间DP(动态规划)求解

    首先放上原题链接 点我,点我进入原题 什么是动态规划? 在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.而且每次求出的解不是独立的,我们需要逐层推出最优解. 以这 ...

  5. 二叉树——二叉树问题(洛谷 P3884)

    题目选自洛谷P3884 ** 解题思路** 经过剖析样例,我微微思索手动模拟后发现 要找最近的公共祖先,一次次地向上找就好了嘛,其实这有点并查集地意思 寻找时可分为两种情况 1.两点在不同子树中,有公 ...

  6. 二叉树——求先序排列(洛谷 P1030)

    题目选自洛谷P1030 首先,一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D). 因为题目求先序,意味着要不断找根. 那么我们来看这道题方法:(示例) 中序ACGDBHZKX ...

  7. 二叉树——医院设置(洛谷 P1364)

    题目选自洛谷P1364 从指定结点开始,使用DFS,对于某个结点来说,搜索的深度就是源点到这个结点的距离,单点贡献(该点所有居民到医院的距离之和)就是源点到这个结点的距离乘上该点的居民数量:然后加上自 ...

  8. 二叉树——美国血统(洛谷 P1827)

    题目选自洛谷P1827 根据前序.中序遍历求出后序遍历,这也是二叉树很重要且基本的知识,还是有必要练练. 至于什么是前.中.后序遍历,这里就不再过多讲述. 用手模拟求解是简单的,接下来看看如何用代码来 ...

  9. 二叉树——二叉树的深度(洛谷 P4913)

    题目选自洛谷P4913 题目描述 给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 1),如果是叶子节点,则输入0 0.建好树后希望知道这棵二叉树的深度.二叉树的深度是指从根节点到叶子结点时,最多 ...

最新文章

  1. SAP RETAIL初阶MM41创建商品主数据BASIC DATA里的Valuation Class
  2. linux 继续编译,【编译】Linux环境编译traceroute
  3. Linux系统编程(六)守护进程
  4. 《TCP/IP详解》学习笔记(七):广播和多播、IGMP协议
  5. 5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...
  6. 微信小程序侧边栏滑动特效(左右滑动)
  7. 允许远程访问MySQL的设置
  8. 网络工程师成长日记368-榆林通信大楼项目回忆录
  9. hdu 3501(欧拉函数)
  10. OC基础--关键字@property 和 @synthesize
  11. DNS与NS、NS记录
  12. 单件模式(Singleton Pattern
  13. 计量经济学学习笔记:多重共线性、异方差、自相关
  14. 调整图像亮度之 线性拉伸 (2) 百分比截断拉伸
  15. 2020,网络工程师的就业前景怎么样?
  16. 拓嘉启远:拼多多虚拟产品相关分享
  17. 【数据结构--静态链表】
  18. 从零开始学习Linux运维,成为IT领域翘楚(三)
  19. Flutter的配置
  20. SQLServer数据库mdf文件中了勒索病毒firex3m,扩展名变为mdf.firex3m

热门文章

  1. 院士怒批:中国科研被SCI和西方支配,贫于创新、贫于思想
  2. python上传文件 request_Python request post上传文件常见要点
  3. JDK 18 / Java 18 GA 发布
  4. 抢了个票,还以为发现了12306的系统BUG
  5. Java 数组转 List 的三种方式及对比
  6. 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了
  7. 文言文能编程了,是噱头还是突破?
  8. UI标签库专题三:JEECG智能开发平台 FormValidation(表单提交及验证标签)
  9. stone 的 log4j配置详解
  10. 架构设计 | 分布式系统调度,Zookeeper集群化管理