洛谷P1040 加分二叉樹

2022-05-02 15:36:10 字數 1512 閱讀 8950

設乙個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行:乙個整數n(n<30),為節點個數。

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

輸出格式:

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

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

輸入樣例#1:

5

5 7 1 2 10

輸出樣例#1:

145

3 1 2 4 5

【題解】

序列上的區間dp。

dp[i][j]表示區間(i,j)這棵子樹的最大加分

dp[i][j] = max + value[k]

記錄方案:根k即可

注意邊界i == k 或 j == k

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

#define min(a, b) ((a) < (b) ? (a) : (b))

8#define max(a, b) ((a) > (b) ? (a) : (b))

910 inline void read(long

long &x)

1117

18const

long

long inf = 0x3f3f3f3f

; 19

const

long

long maxn = 30 + 5;20

21long

long

n, dp[maxn][maxn], value[maxn], root[maxn][maxn];

2223

void dfs(int l, int

r)24

3132

intmain()

3350}51

}52}53 printf("

%d\n

", dp[1

][n]);

54 dfs(1

, n);

55return0;

56 }

洛谷p1040

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