P1040 加分二叉樹

2022-06-02 05:36:08 字數 697 閱讀 7272

題意:題目給出了中序遍歷(左根右)為1~n的序列,要我們構造出一顆樹,滿足最後的結果最大

思路:根據中序遍歷的性質,在乙個連續的區間(l,r)裡,哪乙個數當這段區間的根都是可能的

於是,我們可以採用區間dp的方法,從小開始列舉

先將只有乙個數的情況初始話,然後再將區間從小到大列舉,在列舉區間時,再列舉哪個點當root最好即可

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

const

int maxn=35;5

ll dp[maxn][maxn];

6int

root[maxn][maxn];

7void solve(int l,intr)8

16int

main()

1724

for(int len=1;len//

列舉區間大小

25for(int i=1;i+len<=n;i++)34}

35}36}

37 printf("

%lld\n

",dp[1

][n]);

38 solve(1,n); //

按先序遍歷的方式輸出;

39 }

P1040 加分二叉樹

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

P1040 加分二叉樹

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

P1040 加分二叉樹

題目 很明顯的一道區間dp題目。和acwing上的金字塔有點像。表面上感覺是樹形dp,實則不然。題中給出的1 n是中序遍歷,按照區間dp的套路 設f l r 為中序遍歷是l r的子樹的最大加分值。那麼劃分點佷顯然就是列舉一顆子樹的根節點,再加上這棵樹是一顆二叉樹就更好辦了。dp方程如下 for in...