1090 加分二叉树2003年NOIP全国联赛提高组

 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond

题目描述 Description

  设一个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的前序遍历 

  现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

输入描述 Input Description

  第1行:一个整数n(n<=30),为节点个数。

  第2行:n个用空格隔开的整数,为每个节点的分数(分数<=100)

输出描述 Output Description

  第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。

  第2行:n个用空格隔开的整数,为该树的前序遍历。

样例输入 Sample Input

  5

  5 7 1 2 10

样例输出 Sample Output

  145

  3 1 2 4 5

数据范围及提示 Data Size & Hint

  n(n<=30)   分数<=100

【题解】【记忆化搜索】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll f[40][40][40],sum;
int n,a[40],troop[40][40],ans[40][40];
ll dfs(int now,int l,int r)
{if(f[now][l][r]!=-1) return f[now][l][r];if(l==r){f[now][l][r]=a[l];troop[l][r]=l;return f[now][l][r];}ll ls=0,rs=0,s;for(int i=l;i<now;++i)if(ls<(s=dfs(i,l,now-1)))ls=s,troop[l][now-1]=i;for(int i=now+1;i<=r;++i)if(rs<(s=dfs(i,now+1,r)))rs=s,troop[now+1][r]=i;if(!(l<=now-1)) ls=1;if(!(r>=now+1)) rs=1;f[now][l][r]=(rs*ls)+a[now];return f[now][l][r];
}
void write(int l,int r)
{int now=ans[l][r];printf("%d ",now);if(l<=now-1) write(l,now-1);if(r>=now+1) write(now+1,r);
}
int main()
{int i;scanf("%d",&n);for(i=1;i<=n;++i) scanf("%d",&a[i]);memset(f,-1,sizeof(f));for(i=1;i<=n;++i){ll t=dfs(i,1,n);if(t>sum){troop[1][n]=i; sum=t;for(int j=1;j<=n;++j)for(int k=j;k<=n;++k)ans[j][k]=troop[j][k];}}printf("%lld\n",sum);write(1,n);return 0;} 

【codevs 1090】加分二叉树(记忆化搜索)相关推荐

  1. 记忆化搜索 codevs 2241 排序二叉树

    codevs 2241 排序二叉树 ★   输入文件:bstree.in   输出文件:bstree.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 一个边长为n的正 ...

  2. PAT甲级1090 Highest Price in Supply Chain:[C++题解]树、结点到根结点的距离、记忆化搜索、树形dp

    文章目录 题目分析 题目链接 题目分析 来源:acwing 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的距离.树形dp.记忆化搜索是 ...

  3. 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】

    任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K ...

  4. 【BZOJ3769】spoj 8549 BST again DP(记忆化搜索?)

    [BZOJ3769]spoj 8549 BST again Description 求有多少棵大小为n的深度为h的二叉树.(树根深度为0:左右子树有别:答案对1000000007取模) Input 第 ...

  5. 2020.9.9华为笔试记忆:KMP+记忆化搜索+字典树

    2020.9.9华为笔试 当然,出现在我博客中的笔试都不是我自己的笔试(人家也不给我发笔试链接,小声bibi,诶,好像我也没投,hhhahahha 记者:为什么要做笔试? 我:生活无聊了喏,肯定要做啊 ...

  6. lcDFS1 深度优先遍历1[记忆化搜索]

    1 深度优先遍历 最常见的优化: 1 记忆化搜索: 使用hash记录遍历起点对应的值,然后直接从hash中获得,避免重复计算 2 常见算法: 对于欧拉图和半欧拉图算欧拉路径:hierholzer算法 ...

  7. 动态规划+深度优先搜索+记忆化搜索(干货满满)

    动态规划的定义 动态规划算法与分治法的思想类似,都是通过组合子问题的解来求原问题.我先来给大家介绍一下分治思想,分治思想就是把一个复杂的问题,分解为k个规模相同的子问题,如果还是无法解决,子问题又可以 ...

  8. 洛谷P1057 传球游戏(记忆化搜索)

    点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...

  9. 图论 ---- F. Graph Traveler 记忆化搜索 + 思维预处理(数论同余恒等式)

    题目链接 题目大意: q∈[1,1e5],n∈[1,1000],mi∈[1,10]q\in[1,1e5],n\in[1,1000],m_i\in[1,10]q∈[1,1e5],n∈[1,1000],m ...

最新文章

  1. linux下汇编程序gas,Linux 汇编语言(GNU GAS汇编)开发指南
  2. 如何搭建VUE开发环境
  3. ViewPager图片切换的简单案例
  4. python报错:float object is not callable
  5. fio 测试磁盘性能
  6. JVectorMap 实现中国地图
  7. Linux 常用的帮助命令
  8. 面试常考的数据结构Java实现
  9. vue中如何创建组件?
  10. SEOer将灭绝,尽快辅佐“百毒”对手
  11. 黑色自适应简约个人主页引导页HTML源码
  12. 动态分区分配存储管理方式的内存分配回收
  13. grub4dos初级教程-入门篇(Z)
  14. 【C++】类和对象(中) —— 构造函数 | 析构函数 | 拷贝构造 | 赋值运算符重载
  15. 关闭445端口即关闭共享文件功能
  16. 【大厂面试】面试官看了赞不绝口的Redis笔记(三)分布式篇
  17. 网站搭建需要多少钱?如何搭建比较省钱呢?
  18. 怎么让抖音快速涨粉之抖音数据分析
  19. 宫崎骏魔幻动画电影《哈尔的移动城堡》高清720P,国粤日三语
  20. 虚拟机san存储服务器,VMware SAN介绍

热门文章

  1. matlab画图配色RGB+线性
  2. 厦门小学生计算机编程培训,厦门小学生编程培训
  3. 28_数据库_第28天(数据库、表及表数据、SQL语句)
  4. 物理裸机配置如何转换为天翼云云主机配置
  5. 【CSS】设置文字不能被选中解除限制
  6. 【心情】今天看了日全食。。。
  7. angular 的select标签以及联动
  8. .net基础汇总逆天
  9. 【模考3】笨笨连线游戏
  10. access 数据分组