洛谷P1040 加分二叉樹

2021-09-22 08:22:00 字數 2965 閱讀 9140

乙個n

nn個節點的二叉樹,每個節點都有乙個分數,每顆子樹也有分數

每顆子樹的分數計算方法為:

s ub

tree

的左子樹

的加分×

subt

rees

ubtr

ee的右

子樹的加

分+su

btre

esub

tree

的根的分

數。

subtree的左子樹的加分× subtreesubtree的右子樹的加分+subtreesubtree的根的分數。

subtre

e的左子

樹的加分

×sub

tree

subt

ree的

右子樹的

加分+s

ubtr

eesu

btre

e的根的

分數。若某個子樹為空,規定其加分為1,葉子的加分就是葉節點本身的分數。不考慮它的空子樹

試求一棵符合中序遍歷為(1,

2,3,

…,n)

(1,2,3,…,n)

(1,2,3

,…,n

)且加分最高的二叉樹tre

etree

tree

。要求輸出;

(1)tre

etree

tree

的最高加分

(2)tre

etree

tree

的前序遍歷

我們用dp[

m][i

][j]

dp[m][i][j]

dp[m][

i][j

]來表示一顆以m

mm為根,子樹為i−j

i-ji−

j的樹的最大得分,sum

[l][

r]

sum[l][r]

sum[l]

[r]來代表子樹節點是i−j

i-ji−

j的子樹的最大得分

那麼d p[

m][i

][j]

=max

(dp[

m][i

][j]

,(su

m[i]

[m−1

]∗su

m[m+

1][j

])∗a

[m])

,sum

[i][

j]=m

ax(d

p[m]

[i][

j],s

um[i

][j]

)dp[m][i][j]=max(dp[m][i][j],(sum[i][m-1]*sum[m+1][j]) * a[m]),sum[i][j]=max(dp[m][i][j],sum[i][j])

dp[m][

i][j

]=ma

x(dp

[m][

i][j

],(s

um[i

][m−

1]∗s

um[m

+1][

j])∗

a[m]

),su

m[i]

[j]=

max(

dp[m

][i]

[j],

sum[

i][j

]),這樣狀態轉移就寫完了, 後面就是遞迴輸出這棵樹了,每次找區間的最大值作為根節點,然後向左向右遞迴

void

first

(int l,

int r)}if

(l ==

1&& r == n)

printf

("%lld\n"

, max)

;printf

("%d "

, u);if

(u -

1>= l)

first

(l, u-1)

;if(u +

1<= r)

first

(u+1

, r)

;}

#include

using namespace std;

#define ll long long

const

int maxn =

1e5+5;

const

int inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

const

double eps =

1e-8

;typedef pair<

int,

int> psi;

void

fre(

)ll dp[40]

[40][

40], a[40]

, sum[40]

[40];

int n;

void

first

(int l,

int r)}if

(l ==

1&& r == n)

printf

("%lld\n"

, max)

;printf

("%d "

, u);if

(u -

1>= l)

first

(l, u-1)

;if(u +

1<= r)

first

(u+1

, r);}

intmain

(int argc,

char

*args)

}}first(1

, n)

;return0;

}

洛谷 P1040 加分二叉樹

題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...

洛谷 P1040 加分二叉樹

題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...

洛谷P1040 加分二叉樹

設乙個 n 個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字 1,2,3,n 為節點編號。每個節點都有乙個分數 均為正整數 記第 i 個節點的分數為 di,tree 及它的每個子樹都有乙個加分,任一棵子樹 subtree 也包含 tree 本身 的加分計算方法如下 subtree 的左子...