题目描述 Description

设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:

subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数

若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空

子树。

试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;

(1)tree的最高加分

(2)tree的前序遍历

现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

输入描述 Input Description

第1行:一个整数n(n<=30),为节点个数。

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

输出描述 Output Description

第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。

第2行:n个用空格隔开的整数,为该树的前序遍历。

样例输入 Sample Input

5

5 7 1 2 10

样例输出 Sample Output

145

3 1 2 4 5

数据范围及提示 Data Size & Hint

n(n<=30)

分数<=100

解题思路

一只树形动规,由于给出的是中序遍历(刚开始没看到),所以每枚举一个节点,它的左边就是它的左子树,右边就是右子树,所以可以。。。好吧,我实在想不到递推的关系式,所以果断选择了记忆化搜索,建立两个数组,其中数组f[i,j]储存的是从i到j的最大值,Root[i,j]表示i到j中的根结点,下附代码。

 program tree;
var f,root:array[..,..] of longint;
i,n:longint;
function dfs(l,r:longint):longint;
var i:longint;
begin
if f[l,r]<>- then exit(f[l,r]);
if l>r then begin f[l,r]:=; exit(); end;
for i:=l to r do//枚举最大值和根结点
begin
if f[l,r]<dfs(l,i-)*dfs(i+,r)+f[i,i] then
begin
root[l,r]:=i;
f[l,r]:=dfs(l,i-)*dfs(i+,r)+f[i,i];
end;
end;
exit(f[l,r]);
end; procedure print(l,r:Longint);
begin
if l>r then exit;
write(root[l,r],' ');//输出前序遍历
print(l,root[l,r]-);
print(root[l,r]+,r);
end; begin
read(n);
fillchar(f,sizeof(f),byte(-));
for i:= to n do read(f[i,i]);
for i:= to n do
begin
f[i,i-]:=;//如果不存在该树填1
root[i,i]:=i;//任何节点的根都是它本身
end;
writeln(dfs(,n));
print(,n);
end.

CODEVS 1090 加分二叉树的更多相关文章

  1. CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)

    CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...

  2. CODEVS1090 加分二叉树

    codevs1090 加分二叉树 2003年NOIP全国联赛提高组 题目描述 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点 ...

  3. NOIP2003加分二叉树[树 区间DP]

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  4. 记忆化搜索 codevs 2241 排序二叉树

    codevs 2241 排序二叉树 ★   输入文件:bstree.in   输出文件:bstree.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 一个边长为n的正三 ...

  5. Vijos 1100 加分二叉树

    题目 1100 加分二叉树 2003年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 设一个n个节点的二叉树tree的中序遍历为( ...

  6. P1040 加分二叉树

    转自:(http://www.cnblogs.com/geek-007/p/7197439.html) 经典例题:加分二叉树(Luogu 1040) 设一个 n 个节点的二叉树 tree 的中序遍历为 ...

  7. 洛谷P1040 加分二叉树(树形dp)

    加分二叉树 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...

  8. 【洛谷】P1040 加分二叉树

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

  9. 【题解】NOI2009二叉查找树 + NOIP2003加分二叉树

    自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点.在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧) ...

随机推荐

  1. eclipse安装插件的方法,以python为例子

    一 转载自:http://www.cnblogs.com/linzhenjie/articles/2639113.html 1.基本需求 1.Eclipse 集成开发环境下载 http://115.c ...

  2. 下拉列表(web),用jQuery实现

    <!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" conten ...

  3. bootstrap在iis中发布后无法看到图标,字体样式

      因为框架使用了字体文件来显示矢量的图标,为了能在IIS上正常显示图标,可以通过增加iis的MIME-TYPE来支持图标字体文件:

  4. 关于Collections中的sort()方法总结

    用Java集合中的Collections.sort方法对list排序的两种方法 本文部分引用自:http://my.oschina.net/leoson/blog/131904 用Collection ...

  5. javascript中substring和substr方法

    1.substring 方法 定义:用于提取字符串中介于两个指定下标之间的字符 语法:stringObject.substring(start,stop) 参数描述: start 必需.一个非负的整数 ...

  6. nyoj 86 找球号(一)

    找球号(一) 时间限制:3000 ms  |            内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏.游戏规则为:在一堆球中,每个球上都有一个整数编号i(0& ...

  7. (原创)fedora 17安装KVM虚拟机

    1.安装KVM yum groupinstall Virtualization 'Virtualization Client' 2.安装api支持 yum install libvirt servic ...

  8. android事件分发介绍

        Android事件分发 事件分发3个步骤 dispatchTouchEvent(event)派发 onInterceptTouchEvent(event)拦截 onTouchEvent(eve ...

  9. iOS-Reachability的使用

    // 下载地址:http://pan.baidu.com/s/1gd5NNDD   // 1. 添加Reachability.h和Reachibility.m文件到项目中 // 2. 添加System ...

  10. Android--LowMemoryKiller知识点补充

    Android在内存管理上与linux有些小的区别.其中一个就是引入了Low memory killer . 1.引入原因: Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该 ...