背景

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 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相关推荐

  1. 洛谷P1040 加分二叉树运用区间DP(动态规划)求解

    首先放上原题链接 点我,点我进入原题 什么是动态规划? 在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.而且每次求出的解不是独立的,我们需要逐层推出最优解. 以这 ...

  2. TYVJ 矩阵取数 Label:高精度+dp

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  3. AcWing479.加分二叉树(区间DP)题解

    加分二叉树 题目传送门 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号. 每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...

  4. 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)

    加分二叉树 ssl 1033 luogu 1040 题目大意: 有一棵中序遍历为1,2,3-n的二叉树(当然二叉树的样子没有固定),现在给出每个节点的分数,一个节点的加数=两个子节点的加数相乘+当前节 ...

  5. 【树型DP】加分二叉树

    问题 b: [树型DP]加分二叉树 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...

  6. DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )

    我们先慢慢来 加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 代码实现 太空梯 题目 题解 代码实现 加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 其实说白了,这个*序就是根ro ...

  7. 加分二叉树 java_P1040 加分二叉树

    P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...

  8. Vijos 1100 (区间DP)

    题目链接: https://vijos.org/p/1100 题目大意:NOIP著名的加分二叉树.给出一棵树的中序遍历,加分规则左子树*右子树+根.空子树分数为1.问最大加分的树结构,输出树结构的先序 ...

  9. 【NOIP2013提高组T3】加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

最新文章

  1. 编程艺术 二进制中1的个数
  2. 最短路径:Dijkstra、BellmanFord以及SPFA算法
  3. docker+open vswitch多宿主间容器互连构建tomcat服务
  4. 用Python实现归并排序
  5. angular5项目端口冲突之解决办法
  6. 职场人必备的几个PPT进阶小技巧
  7. 第二周CoreiDRAW总结
  8. 助力 Android 抗衡 iOS,华为发布方舟编译器!
  9. linux wget安装mysql_linux安装mysql
  10. python用户取消了安装_python的安装
  11. 2017-2018-2 1723《程序设计与数据结构》第九周作业 第二周结对编程 总结
  12. mapxtreme for java_在MapXtreme for Java 4.8.0 中公布新制造的电子地图
  13. nupkg 本地安装_使用Nuget安装离线包nupkg
  14. edius多机位多轨编辑
  15. u2000网管服务器系统安装,华为U2000安装
  16. WIN10专业版激活后变成教育版怎么解决
  17. foxmail客户端设置网易邮箱--提示邮箱地址或密码错误
  18. Ansys/Abaqus/nbsp;热应力分析.20…
  19. 大学计算机 ps试题及答案,2016计算机一级PS练习题及答案
  20. tensorflow基本知识

热门文章

  1. .Net中的事件处理模型
  2. 2009年即将过去,准备迎接2010
  3. 【Java】使用springboot框架中的注解@ManyToOne遇到的坑
  4. python介绍环境搭建、变量输入输出
  5. mysql的十进位,MySQL十进制字段的正确默认值是什么?
  6. 关于 HttpServlet、GenericServlet 和 Servlet 的关系
  7. 前端开发者正在被迫成为全栈开发人员
  8. web前端前景近几年怎么样,是否饱和?
  9. Linux启动syslog进程,linux – 使用systemd启动的进程正在记录到/ var / log / syslog和/var/log/daemon.log...
  10. mysql not in优化_98%的人不知道的MySQL优化器原理