2023年分割槽聯賽提高組之三 加分二叉樹 dp

2021-07-11 14:39:40 字數 1648 閱讀 2716

題目大意

設乙個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 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間...