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