加分二叉树
来源:互联网 发布:淘宝电话号码采集 编辑:程序博客网 时间:2024/05/30 23:31
加分二叉树
Description
设一个
每个节点都有一个分数(均为正整数),记第
subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
若某个子树的儿子只有一个,规定另一个儿子的加分为1,叶子的加分就是叶节点本身的分数,不考虑它的空子树。
试求一棵符合中序遍历为(
(1)tree的最高加分
(2)tree的前序遍历
Input
第
第
Output
第
第
Sample Input
5
5 7 1 2 10
Sample Output
145
3 1 2 4 5
Solution
易知中序遍历的特点是“根左右”。
所以在
枚举根
Code
#include <iostream>#include <cstdio>#define Max(x,y) ((x)>(y)?(x):(y))using namespace std;unsigned f[50][50];int g[50][50];int n;int c[50];void work(int l,int r){ if(l>r)return; printf(" %d ",g[l][r]); work(l,g[l][r]-1); work(g[l][r]+1,r);}int main(){ freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&c[i]); f[i][i]=c[i]; g[i][i]=i; } for(int i=n;i>=1;i--) for(int j=i+1;j<=n;j++) for(int k=i;k<=j;k++){ unsigned tmp=f[i][k-1],ttt=f[k+1][j]; if(k-1<i)tmp=1; if(k+1>j)ttt=1; if(tmp*ttt+c[k]>f[i][j]){ f[i][j]=tmp*ttt+c[k]; g[i][j]=k; } } printf("%d\n",f[1][n]); work(1,n); return 0;}
0 0
- 加分二叉树
- 1078 加分二叉树
- 加分二叉树_DP
- 加分二叉树
- 二叉树--面试加分
- 加分二叉树
- vijos1100 加分二叉树
- 加分二叉树
- 1090 加分二叉树
- Codevs1090 加分二叉树
- 加分二叉树
- NOIP2003 加分二叉树
- P1073 加分二叉树
- ssl1033 加分二叉树
- 加分二叉树
- 加分二叉树
- P1100 加分二叉树
- 加分二叉树 noip
- C语言基础 字母大小写转换
- spring项目整合jedis及注意事项
- 2016-6-24 无刷新提交
- 利用WebMagic的Cookie机制进行页面爬取
- JS解析json数据(如何将json字符串转化为数组)
- 加分二叉树
- 物品装箱问题
- 身份证号码验证算法
- 利用栈解析算术表达式
- pods添加的第三方库导入头文件不联想
- SQL常用语句
- MSReportBuilder 开发学习一
- C语言基础 枚举型变量定义与输出
- sql 中case函数