加分二叉樹

2021-10-18 16:18:37 字數 3032 閱讀 2376

設乙個n

nn個節點的二叉樹tre

etree

tree

的中序遍歷為(1,

2,3,

…,n)

(1,2,3,…,n)

(1,2,3

,…,n

),其中數字1,2

,3,…

,n

1,2,3,…,n

1,2,3,

…,n為節點編號。

每個節點都有乙個分數(均為正整數),記第i

ii個節點的分數為d

id_i

di​,tre

etree

tree

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

tree

subtree

subtre

e(也包含tree本身)的加分計算方法如下:

s ub

tree

subtree

subtre

e的左子樹的加分 × sub

tree

subtree

subtre

e的右子樹的加分 + sub

tree

subtree

subtre

e的根的分數

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

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

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

2,3,

…,n)

(1,2,3,…,n)

(1,2,3

,…,n

)且加分最高的二叉樹tre

etree

tree

。要求輸出:

(1)tree的最高加分

(2)tree的前序遍歷

輸入格式

第1

11行:乙個整數n

nn,為節點個數。

第2

22行:n

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

<分數

<

1000《分數<100

0《分數

<10

0)。輸出格式

第1

11行:乙個整數,為最高加分(結果不會超過int範圍)。

第2

22行:n

nn個用空格隔開的整數,為該樹的前序遍歷。如果存在多種方案,則輸出字典序最小的方案。

資料範圍

n

<

30n<30

n<30

輸入樣例:

557

1210

輸出樣例:

14531

245

思路(區間dp,二叉樹的遍歷) o(n

3)

o(n^3)

o(n3

)狀態表示:f[i

][j]

f[i][j]

f[i][j

] 表示中序遍歷是 w[i

w[iw[

i~j]

j]j]

的所有二叉樹的得分的最大值。

狀態計算:f[i

][j]

=max

(f[i

][k−

1]∗f

[k+1

][j]

+w[k

])

f[i][j] = max(f[i][k - 1] * f[k + 1][j] + w[k])

f[i][j

]=ma

x(f[

i][k

−1]∗

f[k+

1][j

]+w[

k])即將f[i

][j]

f[i][j]

f[i][j

]表示的二叉樹集合按根節點分類,則根節點在 k

kk 時的最大得分即為 f[i

][k−

1]∗f

[k+1

][j]

+w[k

]f[i][k - 1] * f[k + 1][j] + w[k]

f[i][k

−1]∗

f[k+

1][j

]+w[

k],則f [i

][j]

f[i][j]

f[i][j

]即為遍歷 k

kk 所取到的最大值。

在計算每個狀態的過程中,記錄每個區間的最大值所對應的根節點編號。

那麼最後就可以通過dfs求出最大加分二叉樹的前序遍歷了。

時間複雜度:狀態總數是 o(n

2)

o(n^2)

o(n2

),計算每個狀態需要 o(n

)o(n)

o(n)

的計算量,因此總時間複雜度是 o(n

3)

o(n^3)

o(n3)。

#include

using

namespace std;

const

int maxn=

110;

int n;

int w[maxn]

;int f[maxn]

[maxn]

;int root[maxn]

[maxn]

;void

dfs(

int l,

int r)

intmain()

for(

int len =

1; len <= n; len++)}

}}printf

("%d\n"

, f[1]

[n])

;dfs(1

, n)

;puts(""

);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...