sωēeτ¨fαrm » 日志 » 加分二叉树(NOIP2003)
加分二叉树(NOIP2003)
deadrain 发表于 2007-08-14 23:28:43
用数组a[i,j]记录从第i个数到第j个数的最大加分,b[i,j]记录这个最大加分的根节点标号。
叶结点的加分即为a[i,i],根节点标号即为b[i,i]=i。
最后再搜索一下,a[1,n]即为解。
CODE:
----------------------------------------------------
叶结点的加分即为a[i,i],根节点标号即为b[i,i]=i。
最后再搜索一下,a[1,n]即为解。
CODE:
----------------------------------------------------
program p1100;
var
n,i:integer;
a:array[1..30,1..30] of longint;
b:array[1..30,1..30] of integer;
procedure try(l,r:integer);
var
i,value:longint;
begin
if l>r then a[l,r]:=1;
for i:=l to r do
begin
if a[l,i-1]=0 then try(l,i-1);
if a[i+1,r]=0 then try(i+1,r);
value:=a[l,i-1]*a[i+1,r]+a[i,i];
if value>a[l,r] then
begin
a[l,r]:=value;
b[l,r]:=i;
end;
end;
end;
procedure print(l,r:longint);
begin
if l>r then exit;
write(b[l,r],' ');
print(l,b[l,r]-1);
print(b[l,r]+1,r);
end;
begin
readln(n);
for i:=1 to n do
begin
read(a[i,i]);
b[i,i]:=i;
end;
try(1,n);
writeln(a[1,n]);
print(1,n);
writeln;
end.
相关日志:
- » NOIP结束了
- » 镇江一游(2)
- » 镇江一游(1)
- » zoj 1002 Fire Net
- » 告别之战
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾












