题目描述

设一个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

dp[i][j]表示区间i到j所能产生的最大贡献

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 106;
int midtree[maxn];
int n;
int dp[maxn][maxn];
inline int read() {
int x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-')f = -1;
c = getchar();
}
while(c <= '9' && c>= '0') x = x*10+c-'0',c = getchar();
return x*f;
}
int root[42][42];
void print(int l,int r) {
if(l>r)return;
if(l==r){
printf("%d ",l);
return ;
}
printf("%d ",root[l][r]);
int mid=root[l][r];
print(l,mid-1);
print(mid+1,r);
}
int main() {
n=read();
for(int i=1;i<=n;++i)
midtree[i] = read(),dp[i][i]=midtree[i],root[i][i]=i;
for(int i=1;i<=n+1;++i) {
dp[i][i-1]=1;
}
for(int i=n;i>=1;--i)
{
for(int j=i+1;j<=n;++j)
{
for(int k=i;k<=j;++k)
{
if(dp[i][j]<midtree[k]+dp[i][k-1]*dp[k+1][j])
{
root[i][j]=k;
dp[i][j]=midtree[k]+dp[i][k-1]*dp[k+1][j];
}
}
}
}
printf("%d\n",dp[1][n]);
print(1,n);
return 0;
}

最新文章

  1. html中用div代替textarea实现输入框高度随输入内容变化
  2. kafka-0.10.0官网翻译(一)入门指南
  3. Tp-link TL-WR841N无线路由器端口映射到外网如何设置
  4. Flex数据绑定陷阱(一)
  5. 【131031】asp.net &lt;%%&gt;&amp;&lt;%#%&gt;&amp;&lt;%=%&gt;&amp;&lt;%@%&gt;&amp;&lt;%$%&gt;用法区别
  6. Simple Chroma Key 0.1.16 图片抠像(vs2003) 无任何插件
  7. uva 10859
  8. STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
  9. 观察者模式Demo
  10. [置顶] 软件架构师的12项修炼_读书纪要_P3商务技能修炼
  11. atitit.集filt经营分部 filter总结
  12. UVA 644 Immediate Decodability (字符处理)
  13. 向大家推荐个android的游戏引擎——cocos2d-x
  14. 用PowerShell代替批处理吧!
  15. Vim+Vundle+YouCompleteMe 安装
  16. nginx代理 (带着请求头)
  17. vue_vuex
  18. 超级干货 :一文读懂数据可视化 ZT
  19. Error 25007.初始化合成时发生错误。安装程序无法使用 LoadLibraryShim() 加载合成。
  20. Linux High Availabi RHCS

热门文章

  1. numpy 三个点的使用[...]
  2. Python爬虫,爬取实验楼全部课程
  3. shell-code-拷贝文件
  4. Linux的档案权限与目录配置
  5. 03_HibernateSessionFactory源码分析
  6. C++ STL 的初步认知
  7. 防止csrf
  8. java jstl标签
  9. JDBC 学习笔记(四)—— JDBC 加载数据库驱动,获取数据库连接
  10. 【Vjudge】P558E A Simple Task(线段树暴力)