題目大意
設乙個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的前序遍歷 分析
f[i,j]表示區間|i,j|中建成加權二叉樹能夠取得的最大值。
明顯有轉移方程f[i,j]=max
i+1<=k<=j-1
同時轉移的時候用g[i,j]記錄路徑,最後遞迴輸出。
以上copy
一下自己寫的:
1.注意題目只用輸出tree的最高加分
2.結果要用int64;
3.列舉時要先把[i,i+1]的所有區間列舉出來,再列舉[i,i+2]的所有區間列舉出來……最後列舉[i,i+n-1]的區間。具體見程式。**
var
f:array[1..30,1..30] of int64;
r:array[1..30,1..30] of longint;
a:array[1..30] of longint;
i,j,k,l:longint;
n:longint;
procedure shu(ro,l:longint);
begin
if ro<=l then
begin
write(r[ro,l]:3);
shu(ro,r[ro,l]-1);
shu(r[ro,l]+1,l);
end;
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
begin
f[i,i]:=a[i];
r[i,i]:=i;
end;
for l:=1 to n-1 do
for i:=1 to n-l do
begin
j:=i+l;
f[i,j]:=f[i,i]+f[i+1,j];
r[i,j]:=i;
if f[j,j]+f[i,j-1]>f[i,j]
then
begin
f[i,j]:=f[j,j]+f[i,j-1];
r[i,j]:=j;
end;
for k:=i+1 to j-1 do
if f[i,k-1]*f[k+1,j]+f[k,k]>f[i,j]
then
begin
f[i,j]:=f[i,k-1]*f[k+1,j]+f[k,k];
r[i,j]:=k;
end;
end;
writeln(f[1,n]);
end.
2023年分割槽聯賽提高組之三 合
description n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 ti 1 tk 1 i k 你的任務是,已知所有n位同學的身高,計...
2023年分割槽聯賽提高組之三 挖地雷
題目 description 在乙個地圖上有n個地窖 n 20 每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。例如 k1 k2,kv 挖地雷的順序 max 挖地雷的數量 作者思路 最 長 路。遞推公式 f i max v i var x,f,v array 0.21 of longin...
2023年分割槽聯賽普級組之三 採藥
description 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間...