codevs 1090 加分二叉樹

2022-02-13 10:06:24 字數 1336 閱讀 3138

2023年noip全國聯賽提高組

時間限制: 1 s

空間限制: 128000 kb

題目等級 : 鑽石 diamond

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

現在,請你幫助你的好朋友xz設計乙個程式,求得正確的答案。

輸入描述 input description

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

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

輸出描述 output description

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

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

樣例輸入 sample input

5 7 1 2 10

樣例輸出 sample output

3 1 2 4 5

資料範圍及提示 data size & hint

n(n<=30)

分數<=100

【題目大意】

規定一棵樹的得分規則與中序遍歷,求最大分值與前序遍歷。

【思路】

記憶化搜尋。

p[x][y]為x--y點的根,f[x][y]為x--y的最大分數。

【code】

#include#include

#include

using

namespace

std;

intn,ans;

int w[101],f[101][101],p[101][101

];int dp(int x,int

y)

}return

f[x][y];

}void qx(int x,int

y) printf(

"%d

",p[x][y]);

qx(x,p[x][y]-1

); qx(p[x][y]+1

,y);

}int

main()

codevs 1090 加分二叉樹(記憶化搜尋)

1090 加分二叉樹 2003 年noip 全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題目描述 description 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數...

479 加分二叉樹

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

加分二叉樹

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