【codevs 1090】加分二叉树(记忆化搜索)
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】加分二叉树(记忆化搜索)相关推荐
- 记忆化搜索 codevs 2241 排序二叉树
codevs 2241 排序二叉树 ★ 输入文件:bstree.in 输出文件:bstree.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 一个边长为n的正 ...
- PAT甲级1090 Highest Price in Supply Chain:[C++题解]树、结点到根结点的距离、记忆化搜索、树形dp
文章目录 题目分析 题目链接 题目分析 来源:acwing 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的距离.树形dp.记忆化搜索是 ...
- 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K ...
- 【BZOJ3769】spoj 8549 BST again DP(记忆化搜索?)
[BZOJ3769]spoj 8549 BST again Description 求有多少棵大小为n的深度为h的二叉树.(树根深度为0:左右子树有别:答案对1000000007取模) Input 第 ...
- 2020.9.9华为笔试记忆:KMP+记忆化搜索+字典树
2020.9.9华为笔试 当然,出现在我博客中的笔试都不是我自己的笔试(人家也不给我发笔试链接,小声bibi,诶,好像我也没投,hhhahahha 记者:为什么要做笔试? 我:生活无聊了喏,肯定要做啊 ...
- lcDFS1 深度优先遍历1[记忆化搜索]
1 深度优先遍历 最常见的优化: 1 记忆化搜索: 使用hash记录遍历起点对应的值,然后直接从hash中获得,避免重复计算 2 常见算法: 对于欧拉图和半欧拉图算欧拉路径:hierholzer算法 ...
- 动态规划+深度优先搜索+记忆化搜索(干货满满)
动态规划的定义 动态规划算法与分治法的思想类似,都是通过组合子问题的解来求原问题.我先来给大家介绍一下分治思想,分治思想就是把一个复杂的问题,分解为k个规模相同的子问题,如果还是无法解决,子问题又可以 ...
- 洛谷P1057 传球游戏(记忆化搜索)
点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...
- 图论 ---- 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 ...
最新文章
- linux下汇编程序gas,Linux 汇编语言(GNU GAS汇编)开发指南
- 如何搭建VUE开发环境
- ViewPager图片切换的简单案例
- python报错:float object is not callable
- fio 测试磁盘性能
- JVectorMap 实现中国地图
- Linux 常用的帮助命令
- 面试常考的数据结构Java实现
- vue中如何创建组件?
- SEOer将灭绝,尽快辅佐“百毒”对手
- 黑色自适应简约个人主页引导页HTML源码
- 动态分区分配存储管理方式的内存分配回收
- grub4dos初级教程-入门篇(Z)
- 【C++】类和对象(中) —— 构造函数 | 析构函数 | 拷贝构造 | 赋值运算符重载
- 关闭445端口即关闭共享文件功能
- 【大厂面试】面试官看了赞不绝口的Redis笔记(三)分布式篇
- 网站搭建需要多少钱?如何搭建比较省钱呢?
- 怎么让抖音快速涨粉之抖音数据分析
- 宫崎骏魔幻动画电影《哈尔的移动城堡》高清720P,国粤日三语
- 虚拟机san存储服务器,VMware SAN介绍