題意:題目給出了中序遍歷(左根右)為1~n的序列,要我們構造出一顆樹,滿足最後的結果最大
思路:根據中序遍歷的性質,在乙個連續的區間(l,r)裡,哪乙個數當這段區間的根都是可能的
於是,我們可以採用區間dp的方法,從小開始列舉
先將只有乙個數的情況初始話,然後再將區間從小到大列舉,在列舉區間時,再列舉哪個點當root最好即可
1 #include2using
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...