樹型DP 加分二叉樹

2021-09-25 11:04:58 字數 1006 閱讀 8807

設乙個 n個節點的二叉樹tree的中序遍歷為( 1,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 行: 1 個整數 n(n<30) ,為節點個數。

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

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

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

5

5 7 1 2 10

145

3 1 2 4 5

一開始這題想的挺複雜,一直在考慮怎麼搭建樹,後來看資料後才發現其實樹是在每一次迴圈中不斷搭建起來的,控制中序遍歷只需要在動態轉移時分為小於該點的遞迴和大於該點的遞迴就可以保證,空子樹的加分為1也不會影響到上一層的加分,直接套公式就行,只要想清楚了這一點就很好寫了。

#include#include#include#includeint n,f[30][30],root[30][30];

using namespace std;

int maxnum(int i,int j)}}

return f[i][j];

}void first(int i,int j)//根據儲存的root和中序遍歷來輸出先序遍歷

cout

return 0;

}

加分二叉樹 樹型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個節點的分數為 d i tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...

加分二叉樹

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