題解 加分二叉樹

2021-10-09 23:28:39 字數 3283 閱讀 8001

設乙個 n

nn 個節點的二叉樹tree

\text

tree

的中序遍歷為(1,

2,3,

…,n)

(1,2,3,\ldots,n)

(1,2,3

,…,n

),其中數字 1,2

,3,…

,n

1,2,3,\ldots,n

1,2,3,

…,n 為節點編號。每個節點都有乙個分數(均為正整數),記第 i

ii 個節點的分數為 d

id_i

di​,tree

\text

tree

及它的每個子樹都有乙個加分,任一棵子樹 subtree

\text

subtree

(也包含 tree

\text

tree

本身)的加分計算方法如下:

subtree

\text

subtree

的左子樹的加分×

subtree

\times \text

×subtree

的右子樹的加分 +

subtree

+ \text

+subtree

的根的分數。

若某個子樹為空,規定其加分為 1

11,葉子的加分就是葉節點本身的分數。不考慮它的空子樹。

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

2,3,

…,n)

(1,2,3,\ldots,n)

(1,2,3

,…,n

) 且加分最高的二叉樹 tree

\text

tree

。要求輸出

tree

\text

tree

的最高加分。

tree

\text

tree

的前序遍歷。

第 1

11 行 1

11 個整數 n

nn,為節點個數。

第 2

22 行 n

nn 個用空格隔開的整數,為每個節點的分數

第 1

11 行 1

11 個整數,為最高加分( ans

≤4

,000

,000

,000

ans \le 4,000,000,000

ans≤4,

000,

000,

000)。

第 2

22 行 n

nn 個用空格隔開的整數,為該樹的前序遍歷。

557

1210

14531

245

n

<

30n< 30

n<30

。分數<

100<100

<10

0。因為中序遍歷為(1,

2,3,

…,n)

(1,2,3,\ldots,n)

(1,2,3

,…,n

),所以我們可以得到每一棵子樹都滿足:左子樹各節點序號《根《右子樹各節點序號

所以想到區間dp

我們設dp[

i][j

]dp[i][j]

dp[i][

j]表示從i

ii ~ j

jj生成樹的最大加分

len唄,區間dp基本操作

列舉根節點k(l

<

k

k(l k(

l<

k,d p[

l][r

]=mi

n(dp

[l][

r],d

p[l]

[k−1

]∗dp

[k+1

][r]

+a[k

])

dp[l][r]=min(dp[l][r],dp[l][k-1]*dp[k+1][r]+a[k])

dp[l][

r]=m

in(d

p[l]

[r],

dp[l

][k−

1]∗d

p[k+

1][r

]+a[

k])

for

(int len=

1;len++len)}}

}

每次轉移的時候儲存一下根節點,有了根節點不就好做了嗎\ (^o^)/~

void

print

(int l,

int r)

printf

("%d "

,root[l]

[r]);if

(l==r)

print

(l,root[l]

[r]-1)

;print

(root[l]

[r]+

1,r)

;}

#include

#include

#include

using

namespace std;

const

int maxn=35;

int n;

int dp[maxn]

[maxn]

;int a[maxn]

;int root[maxn]

[maxn]

;void

print

(int l,

int r)

printf

("%d "

,root[l]

[r]);if

(l==r)

print

(l,root[l]

[r]-1)

;print

(root[l]

[r]+

1,r);}

intmain()

for(

int i=

1;i<=n;i++

)for

(int len=

1;len++len)}}

}printf

("%d\n"

,dp[1]

[n])

;print(1

,n);

return0;

}

加分二叉樹

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

加分二叉樹

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

加分二叉樹

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