洛谷 加分二叉樹,P1040

2021-08-17 17:01:04 字數 1017 閱讀 2498

dp,整個樹是由中序遍歷1,n構成的,score[i][j]記錄的是中序遍歷為i,i+1,...,j-1,j的子樹的最高加分。tag[i][j]記錄的是中序遍歷為i~j的子樹的根節點,用於重建前序遍歷。

那最高加分的結果對應的是score[1][n]。

dp的思路就是,先設定只有乙個節點的子樹的初值,即只含有根節點的子樹,即score[i][i]和tag[i][i]的初始值。

然後按照子樹含有的元素個數,從少到多dp。

inline int max_score這個函式,就是用來dp的。原理是,遍歷i到j中的每乙個點k,是該子樹根節點時取得的最高加分,進而得到i到j的子樹的最高加分。因為端點處需要特殊處理,k=i和k=j單拿出來處理。

最後用堆疊結合tag輸出前序遍歷。

#include#include#include#include#includeusing namespace std;

inline int max_score(int score[40], int tag[40], int i, int j)

k = j;

if (score[i][j] < score[i][k - 1] + score[j][j])

for (k = i + 1; k < j; k ++)

}}int main()

for (int i = 0; i < n; i ++)

for (int i = 2; i <= n; i ++)

} printf ("%d\n", score[0][n - 1]);

// printf ("%d %d %d %d %d\n", tag[0][4], tag[0][1], tag[1][1], tag[3][4], tag[4][4]);

stack> tree;

int l = 0, r = n - 1;

tree.push(pair(l, r));

while (!tree.empty())

} return 0;

}

洛谷 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 的左子...