加分二叉树
2018-03-22 08:45
218 查看
原题:zjnu1185
题意:
给出一棵二叉树的中序遍历,求怎么样的树的前序遍历才能使数的得分最大
root的分数=root结点的值+lson分数*rson分数
叶子分数=结点值
只要一个儿子的分数=root结点的值+son分数*1
解析:
因为数组为中序遍历,所以假设3~10代表一棵树,6为3~10的root,那么3~5为lson,7~10为rson,所以就可以按照区间dp做
代码:
题意:
给出一棵二叉树的中序遍历,求怎么样的树的前序遍历才能使数的得分最大
root的分数=root结点的值+lson分数*rson分数
叶子分数=结点值
只要一个儿子的分数=root结点的值+son分数*1
解析:
因为数组为中序遍历,所以假设3~10代表一棵树,6为3~10的root,那么3~5为lson,7~10为rson,所以就可以按照区间dp做
代码:
#include<stdio.h> #define D long long D dp[39][39];//dp[i][j]表示i~j结点为一棵树的最大分树 int root[39][39];//保存i~j最大时的root int n; void out_tree(int l,int r){ if(l>r)return; printf("%d ",root[l][r]); out_tree(l,root[l][r]-1); out_tree(root[l][r]+1,r); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&dp[i][i]); dp[i][i-1]=1;dp[i+1][i]=1; root[i][i]=i; } for(int l=2;l<=n;l++){//l 区间长度 for(int i=1;i<=n-l+1;i++){//i 区间起点 for(int j=i;j<=i+l-1;j++){//j 取区间内一点为此区间的root if(dp[j][j]+dp[i][j-1]*dp[j+1][i+l-1]>dp[i][i+l-1]){ dp[i][i+l-1]=dp[j][j]+dp[i][j-1]*dp[j+1][i+l-1]; root[i][i+l-1]=j; } } } } printf("%lld\n",dp[1] ); out_tree(1,n); printf("\n"); }
相关文章推荐
- [NOIP2003]加分二叉树 --动态规划-类似矩阵相乘
- NOIP2013加分二叉树
- luogu1040加分二叉树
- VJP1100 加分二叉树(树形DP)
- 加分二叉树
- Noip 2003T3 加分二叉树
- NuptOJ1039加分二叉树——树形动态规划
- NOIP2003 加分二叉树
- NOIP2003 加分二叉树
- VijosP1100:加分二叉树
- 加分二叉树 2003年NOIP全国联赛提高组
- 1090 加分二叉树
- 洛谷P1040 加分二叉树(区间dp)
- 加分二叉树
- 加分二叉树
- 【b303】加分二叉树
- 洛谷P1040 加分二叉树(NOIP2003)
- NOIP2003 洛谷1040 加分二叉树
- P1040 加分二叉树(区间DP)
- TYVJ 1073 加分二叉树