TYVJ P1073 加分二叉树 Label:区间dp
背景
NOIP2003 提高组 第三道
描述
设一个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的前序遍历
输入格式
第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
输出格式
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。
测试样例1
输入
5
5 7 1 2 10
输出
145
3 1 2 4 5
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N,f[35][35],p[35][35],v[35];void print(int l,int r){printf("%d ",p[l][r]);if(l<=p[l][r]-1) print( l ,p[l][r]-1);if(p[l][r]+1<=r) print( p[l][r]+1 ,r ); }int dp(int l,int r){if(l>r) return 1;if(l==r){p[l][r]=l;return v[l];}if(f[l][r]>=0) return f[l][r];for(int k=l;k<=r;k++){if(dp(l,k-1)*dp(k+1,r)+v[k]>f[l][r]){f[l][r]=dp(l,k-1)*dp(k+1,r)+v[k];p[l][r]=k;}}return f[l][r]; }int main(){ // freopen("01.txt","r",stdin);memset(f,-1,sizeof(f));scanf("%d",&N);for(int i=1;i<=N;i++) scanf("%d",&v[i]);printf("%d\n",dp(1,N));print(1,N);puts(" ");return 0;}额,这一题耗了我很久时间,原因是二叉树问题没搞懂:
不懂的童鞋看这里:二叉树遍历入门之入门(http://www.cnblogs.com/radiumlrb/p/5790331.html)
刚写的
差不多看完就知道这题怎么做的了!
p数组记录路径,f记录当前子树根节点
dp函数算最大值并记录路径
print函数打印路径
转载于:https://www.cnblogs.com/radiumlrb/p/5790367.html
TYVJ P1073 加分二叉树 Label:区间dp相关推荐
- 洛谷P1040 加分二叉树运用区间DP(动态规划)求解
首先放上原题链接 点我,点我进入原题 什么是动态规划? 在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.而且每次求出的解不是独立的,我们需要逐层推出最优解. 以这 ...
- TYVJ 矩阵取数 Label:高精度+dp
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- AcWing479.加分二叉树(区间DP)题解
加分二叉树 题目传送门 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号. 每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)
加分二叉树 ssl 1033 luogu 1040 题目大意: 有一棵中序遍历为1,2,3-n的二叉树(当然二叉树的样子没有固定),现在给出每个节点的分数,一个节点的加数=两个子节点的加数相乘+当前节 ...
- 【树型DP】加分二叉树
问题 b: [树型DP]加分二叉树 时间限制: 1 Sec 内存限制: 64 MB 提交: 8 解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...
- DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )
我们先慢慢来 加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 代码实现 太空梯 题目 题解 代码实现 加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 其实说白了,这个*序就是根ro ...
- 加分二叉树 java_P1040 加分二叉树
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- Vijos 1100 (区间DP)
题目链接: https://vijos.org/p/1100 题目大意:NOIP著名的加分二叉树.给出一棵树的中序遍历,加分规则左子树*右子树+根.空子树分数为1.问最大加分的树结构,输出树结构的先序 ...
- 【NOIP2013提高组T3】加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
最新文章
- 编程艺术 二进制中1的个数
- 最短路径:Dijkstra、BellmanFord以及SPFA算法
- docker+open vswitch多宿主间容器互连构建tomcat服务
- 用Python实现归并排序
- angular5项目端口冲突之解决办法
- 职场人必备的几个PPT进阶小技巧
- 第二周CoreiDRAW总结
- 助力 Android 抗衡 iOS,华为发布方舟编译器!
- linux wget安装mysql_linux安装mysql
- python用户取消了安装_python的安装
- 2017-2018-2 1723《程序设计与数据结构》第九周作业 第二周结对编程 总结
- mapxtreme for java_在MapXtreme for Java 4.8.0 中公布新制造的电子地图
- nupkg 本地安装_使用Nuget安装离线包nupkg
- edius多机位多轨编辑
- u2000网管服务器系统安装,华为U2000安装
- WIN10专业版激活后变成教育版怎么解决
- foxmail客户端设置网易邮箱--提示邮箱地址或密码错误
- Ansys/Abaqus/nbsp;热应力分析.20…
- 大学计算机 ps试题及答案,2016计算机一级PS练习题及答案
- tensorflow基本知识
热门文章
- .Net中的事件处理模型
- 2009年即将过去,准备迎接2010
- 【Java】使用springboot框架中的注解@ManyToOne遇到的坑
- python介绍环境搭建、变量输入输出
- mysql的十进位,MySQL十进制字段的正确默认值是什么?
- 关于 HttpServlet、GenericServlet 和 Servlet 的关系
- 前端开发者正在被迫成为全栈开发人员
- web前端前景近几年怎么样,是否饱和?
- Linux启动syslog进程,linux – 使用systemd启动的进程正在记录到/ var / log / syslog和/var/log/daemon.log...
- mysql not in优化_98%的人不知道的MySQL优化器原理