樹形dp 加分二叉樹 11 05 15

2021-05-25 08:19:54 字數 1558 閱讀 9865

題目:

加分二叉樹

【問題描述】

設乙個n

個節點的二叉樹

tree

的中序遍歷為(

l,2,3,…,n

),其中數字

1,2,3,…,n

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

i個節點的分數為di,

tree

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

subtree

(也包含

tree

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

subtree

的左子樹的加分

× subtree

的右子樹的加分+

subtree

的根的分數

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

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

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

1,2,3,…,n

)且加分最高的二叉樹

tree

。要求輸出;(1

)tree

的最高加分(2

)tree

的前序遍歷

【輸入格式】第1

行:乙個整數n(

n<30),為節點個數。第2

行:n個用空格隔開的整數,為每個節點的分數(分數<

100)。

【輸出格式】第1

行:乙個整數,為最高加分(結果不會超過

4,000,000,000)。第

2行:n個用空格隔開的整數,為該樹的前序遍歷。

【輸入樣例】

55 7 1 2 10

【輸出樣例】

1453 1 2 4 5

分析:這道題很久以前做過,今天整理樹形dp的時候又看到,不同的是他要求輸出最大加分樹的前序遍歷,當時那道題貌似只要求輸出最大加分。這也是乙個難點,要注意方法。

①按當時的方法做,

指標d[l, root, r]表示在中序區間[l, r]里定根root的最大加分。 轉移方程:d[i, k, j] = max*max.

抽風般的用了三維指標,有點受二分的影響。解:for i=[0, n)

max.

②指標:d[l, r]表示在中序區間[l, r]裡,可以取到的最大加分。轉移方程:d[i, j] = max.停止條件:i>j,d[i, j]

= 0; i=j,d[i, j] = a[i]; 解: dp(0, n-1).

明顯地,第二個看著比較爽。為什麼會造成這種二維和三維的差別呢? 看出,其實第二種指標的「動態」程度高些。說實話我還沒能完全理解。啟示就是,要大膽定動態程度高的指標。

最大加分的前序遍歷:

借助乙個樹組

g,g[i, r]

表示在中序區間[l, r]裡

取得最大加分時的根結點的編號。

g[i, r]=k

(滿足d[i,k-1] * d[k+1,j]+a[k]=d[i,j]

)。其實就是

d[i, r]

取最大值時

k的值。然後就能方便地遞迴

構造最優解。

區間DP 加分二叉樹

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

加分二叉樹 樹型DP

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

樹型DP 加分二叉樹

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