洛谷 1040 加分二叉樹

2022-05-25 20:48:17 字數 1333 閱讀 5167

設乙個nn個節點的二叉樹tree的中序遍歷為(1,2,3,…,n1,2,3,…,n),其中數字1,2,3,…,n1,2,3,…,n為節點編號。每個節點都有乙個分數(均為正整數),記第ii個節點的分數為di,treedi,tree及它的每個子樹都有乙個加分,任一棵子樹subtreesubtree(也包含treetree本身)的加分計算方法如下:

subtreesubtree的左子樹的加分× subtreesubtree的右子樹的加分+subtreesubtree的根的分數。

若某個子樹為空,規定其加分為11,葉子的加分就是葉節點本身的分數。不考慮它的空子樹。

試求一棵符合中序遍歷為(1,2,3,…,n1,2,3,…,n)且加分最高的二叉樹treetree。要求輸出;

(1)treetree的最高加分

(2)treetree的前序遍歷

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

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

第11行:11個整數,為最高加分(ans \le 4,000,000,000≤4,000,000,000)。

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

輸入 #1複製

5

5 7 1 2 10

輸出 #1複製

145

3 1 2 4 5

題解:帶一丟丟搜尋的dp

#include#include

#include

#include

#include

#include

typedef

long

long

ll;using

namespace

std;

int n,v[66],f[66][66],rt[66][66

];void ppprint(int l,int

r) printf(

"%d

",rt[l][r]);

ppprint(l,rt[l][r]-1

); ppprint(rt[l][r]+1

,r);

}int

main()

for(int i=n; i>=1; i--)

for(int j=i+1; j<=n; j++)

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

}printf(

"%d\n

",f[1

][n]);

ppprint(

1,n);

return0;

}

洛谷1040 加分二叉樹

題目描述 設乙個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的左子樹的加分 su...