题目大意

设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:

subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数

若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。

试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;

(1)tree的最高加分

(2)tree的前序遍历

题解

  本题最容易忽略的性质便是二叉树中的每一个子树的中序遍历都是一段连续的区间。所以对于一段区间,根据选区间中哪个点作为根来分类动规即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdarg>
using namespace std; void _printf(char *format, ...)
{
#ifdef _DEBUG
va_list(args);
va_start(args, format);
vprintf(format, args);
va_end(args);
#endif
}
//-------------------------------------------------------------------------
const int MAX_NODE = 35;
long long F[MAX_NODE][MAX_NODE];
int RootId[MAX_NODE][MAX_NODE], Val[MAX_NODE];
int TotNode; void DP()
{
for (int i = 1; i <= TotNode; i++)
F[i][i - 1] = F[i][i + 1] = 1;
for (int i = 1; i <= TotNode; i++)
{
F[i][i] = Val[i];
RootId[i][i] = i;
}
for (int len = 2; len <= TotNode; len++)
for (int i = 1; i <= TotNode - len + 1; i++)
{
int j = i + len - 1;
for (int k = i; k <= j; k++)
{
if (F[i][k - 1] * F[k + 1][j] + Val[k] > F[i][j])
{
F[i][j] = F[i][k - 1] * F[k + 1][j] + Val[k];
RootId[i][j] = k;
}
}
}
} void Print(int l, int r)
{
if (l > r)
return;
printf("%d ", RootId[l][r]);
Print(l, RootId[l][r] - 1);
Print(RootId[l][r] + 1, r);
} int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
scanf("%d", &TotNode);
for (int i = 1; i <= TotNode; i++)
scanf("%d", Val + i);
DP();
printf("%lld\n", F[1][TotNode]);
Print(1, TotNode);
return 0;
}

  

最新文章

  1. PRINCE2风险模块
  2. 【CSS】css自定义字体
  3. linux格式批量转换为dos格式
  4. openjudge-最好的草
  5. ORACLE 监听日志文件太大停止写监听日志引起数据库连接不上问题
  6. mysql 在insert 时防止出现主键冲突错误的方法
  7. 002vim常用命令
  8. IE8下jQuery改变png图片透明度时出现的黑边问题
  9. 动态创建MySQL数据库
  10. Android应用性能測试
  11. C# - 设计模式 - 模板模式
  12. redis命令行批量删除匹配到的key
  13. 牛客小白月赛12C (线性筛积性函数)
  14. maven开发项目中遇到的问题
  15. 网站压力测试工具http_load的安装与使用
  16. Minimum Cost POJ - 2516 (模板题 spfa最小费用最大流)
  17. 模仿Semaphore自定义自己的 信号量
  18. 和我一起学Effective Java之类和接口
  19. Applegate 方法使用
  20. python-flask-session和scoped_session区别

热门文章

  1. View Programming Guide for iOS
  2. SpringBoot中如何使用jpa和jpa的相关知识总结
  3. for循环,字典遍历(一)
  4. Python函数式编程简介
  5. TWaver矢量小试——Android演进路线图
  6. 子集和问题 - 回溯&amp;搜索
  7. jdk版本特性
  8. A - Restaurant
  9. docker CE 的安装
  10. Python学习笔记 (2.2)Python中的字符编码问题及标准数据类型之String(字符串)