加分二叉樹(區間動態規劃)

2021-08-09 15:10:34 字數 744 閱讀 4957

設乙個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的前序遍歷

第1行:乙個整數n(n<30),為節點個數。

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

第1行:乙個整數,為最高加分(結果不會超過4,000,000,000)。

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

5

5 7 1 2 10

145

3 1 2 4 5

將dp陣列設為從1開始是為了方便給葉子節點賦初值,防止dp陣列的下標出現負數產生陣列越界。

#include using namespace std; int root[30][30]; bool flag=false; void output_pre(int l,int r)  } } cout《個人**:

動態規劃加分二叉樹問題

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

區間DP 加分二叉樹

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

加分二叉樹(遞迴,區間DP)

演算法 區間dp,二叉樹的遍歷 狀態表示 f i j 表示中序遍歷是 w i j 的所有二叉樹的得分的最大值。狀態計算 f i j max f i k 1 f k 1 j w k 即將 f i j 表示 的二叉樹集合按根節點分類,則根節點在 k 時的最大得分即 為 f i k 1 f k 1 j w...