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

subtreesubtree的左子树的加分× subtreesubtree的右子树的加分+subtreesubtree的根的分数。

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

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

(1)treetree的最高加分

(2)treetree的前序遍历

输入格式
第11行:11个整数n(n<30)n(n<30),为节点个数。

第22行:nn个用空格隔开的整数,为每个节点的分数(分数 <100<100)。

输出格式
第11行:11个整数,为最高加分(Ans \le 4,000,000,000≤4,000,000,000)。

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

输入输出样例
输入 #1 复制
5
5 7 1 2 10
输出 #1 复制
145
3 1 2 4 5

代码:

//#pragma GCC optimize(3,"Ofast","inline")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
int score[35];
int dp[35][35];
void print(int l,int r) {if(l==r) {printf("%d ",l);return ;}if(l>r) return ;for(int i=l;i<=r;i++) {if(dp[l][r]==dp[l][i-1]*dp[i+1][r]+score[i]) {printf("%d ",i);print(l,i-1);print(i+1,r);return ;}}
}
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif//ios::sync_with_stdio(0),cin.tie(0);int n;scanf("%d",&n);rep(i,0,n+1) {rep(j,0,n+1) {dp[i][j]=1;}}rep(i,1,n) {scanf("%d",&score[i]);dp[i][i]=score[i];}score[0]=score[n+1]=1;for(int i=n;i>=1;i--) {for(int j=i;j<=n;j++) {for(int k=i;k<=j;k++) {if(dp[i][k-1]==1&&dp[k+1][j]==1) dp[i][j]=max(dp[i][j],score[k]);else dp[i][j]=max(dp[i][j],dp[i][k-1]*dp[k+1][j]+score[k]);}}}printf("%d\n",dp[1][n]);print(1,n);return 0;
}

P1040 加分二叉树【dp+深搜】相关推荐

  1. P2668 斗地主 dp+深搜版

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  2. 题解HDU6148 Valley Numer(数位DP+深搜DFS)

    题解HDU6148 Valley Numer[数位DP+深搜DFS] 题目 解析 参考源码 题目 Description: 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Nu ...

  3. 二叉树的深搜(DFS)与广搜(BFS)

    转载自: https://blog.csdn.net/u011613367/article/details/50950408 数据结构中的有两个比较重要的算法.深度优先搜索和广度优先搜索. 二叉树中的 ...

  4. [洛谷P1040] 加分二叉树

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

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

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

  6. 加分二叉树 java_P1040 加分二叉树

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

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

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

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

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

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

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

最新文章

  1. Radboud科学家探索材料「量子大脑」——没有软件,硬件也可以实现机器学习 | AI日报...
  2. led动态显示 c语言,单片机LED点阵的纵向移动(动态显示)
  3. pdf屏幕取词 android,===C#屏幕取词Demo热键版鼠标划词版【含语音版】【附源码】===...
  4. TensorFlow 完整的TensorFlow入门教程
  5. JVM-class文件完全解析-方法表集合
  6. SpringBoot+pagehelper分页之后还显示全部数据(分页不管用)的解决方案
  7. k8s 安装nfs_K8s--06 K8s数据持久化
  8. 用python打印九九乘法表while_利用Python循环(包括whilefor)各种打印九九乘法表的实例...
  9. 数值计算方法(二)——复化求积公式
  10. TensorFlow 学习指南 四、分布式
  11. mysql 表的存储类型_MySQL的表类型和存储引擎
  12. Oracle调优检查点
  13. 玩转Vagrant之工作环境的迁移(box的导入与导出)
  14. 聪明的猴子(BZOJ 2429)
  15. itext合成pdf报异常 PDF header signature not found
  16. 安卓通过SQLite实现登录注册功能(小白式教程)
  17. SQL 中INSERT INTO 的使用方法
  18. 【应用随机过程】04. 马尔可夫链的平稳分布
  19. 【Microsoft Azure 的1024种玩法】四. 利用Azure Virtual machines 打造个人专属云盘,速度吊打某云盘...
  20. 微信小程序集成实时音视频通话功能

热门文章

  1. C语言 goto 语句 - C语言零基础入门教程
  2. c语言创建一个hello.txt文件,并检查是否成功,广东工业大学C语言验(上机)任务书2015版.doc...
  3. scala java抽象理解_Scala之类、特质和抽象类
  4. java不显示图片_Java图片显示不出来,怎么解决
  5. c语言中如何打出草花图案,C语言程序设计程设计题目1.doc
  6. mysql2800_mysql error 1045 (2800):。。 'root'@'localhost' (using password:YES)
  7. 投票选举 算法_区块链主流共识算法一文全通
  8. android car bt模块,大谷蓝牙小车BT Car/Android Car手机控制 重力控制小车 安卓操控小车...
  9. php header什么意思,php header是什么意思
  10. JSP 编译原理:JSP 是 Servlet?如何用 Eclipse 查看 JSP 编译生成的 Servlet 源文件?