谁帮我解答一个关于Pascal的问题(NOIP2003提高组binary加分二叉树)

来源:百度知道 编辑:UC知道 时间:2024/06/14 08:28:01
NOIP2003提高组binary加分二叉树
【问题描述】
设一个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 109)。
第2行:n个用空格隔开的整数,为该树的前序遍历。

【输入样例】
5
5 7 1 2 10
【输出样例】
145
3 1 2 4 5
程序也给我一下
O(∩_∩)O 谢谢啦!! ~\(≥▽≤)/~

动态规划
f[i,j]代表子序列a[i]到a[j]的最大加分
g[i,j]代表根的序号
以下是特殊情况
1.f[i,i]=a[i] g[i,i]=i
2.f[i,i-1]=1 子树为空,没有g[i,i-1]
3.f[n,n+1]=1 子树为空,没有g[n,n+1]
如果f[i,j]=0,也就是f[i,j]没有被求出来,不属于特殊情况时
f[i,j]=max(f[k,k]+f[i,k-1]*f[k+1,j])
g[i,j]=k
注:1.max代表求最大值
2.k可以用循环来枚举
3.f[i,k-1]代表左子树加分
4.f[k+1,j]代表右子树加分
以下是程序(vijos上通过了)
program aa;
var
n,i,j,k:longint;
a:array[1..30] of longint;
f,g:array[1..30,0..31] of longint;
procedure print(i,j:longint);
begin
write(g[i,j],' ');
if i<=g[i,j]-1 then print(i,g[i,j]-1);
if g[i,j]+1<=j then print(g[i,j]+1,j);
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
for i:=1 to n do
begin
f[i,i]:=a[i];
g[i,i]:=i;
f[i,i-1]:=1;
end;
f[n,n+1]:=1;
for i:=n downto 1 do
for j:=i to n do
if f[i,j]=0 then
begin