P1040 加分二叉树【dp+深搜】
题目描述
设一个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+深搜】相关推荐
- P2668 斗地主 dp+深搜版
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 题解HDU6148 Valley Numer(数位DP+深搜DFS)
题解HDU6148 Valley Numer[数位DP+深搜DFS] 题目 解析 参考源码 题目 Description: 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Nu ...
- 二叉树的深搜(DFS)与广搜(BFS)
转载自: https://blog.csdn.net/u011613367/article/details/50950408 数据结构中的有两个比较重要的算法.深度优先搜索和广度优先搜索. 二叉树中的 ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 洛谷P1040 加分二叉树运用区间DP(动态规划)求解
首先放上原题链接 点我,点我进入原题 什么是动态规划? 在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.而且每次求出的解不是独立的,我们需要逐层推出最优解. 以这 ...
- 加分二叉树 java_P1040 加分二叉树
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- 【树型DP】加分二叉树
问题 b: [树型DP]加分二叉树 时间限制: 1 Sec 内存限制: 64 MB 提交: 8 解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...
- DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )
我们先慢慢来 加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 代码实现 太空梯 题目 题解 代码实现 加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 其实说白了,这个*序就是根ro ...
- 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)
加分二叉树 ssl 1033 luogu 1040 题目大意: 有一棵中序遍历为1,2,3-n的二叉树(当然二叉树的样子没有固定),现在给出每个节点的分数,一个节点的加数=两个子节点的加数相乘+当前节 ...
最新文章
- Radboud科学家探索材料「量子大脑」——没有软件,硬件也可以实现机器学习 | AI日报...
- led动态显示 c语言,单片机LED点阵的纵向移动(动态显示)
- pdf屏幕取词 android,===C#屏幕取词Demo热键版鼠标划词版【含语音版】【附源码】===...
- TensorFlow 完整的TensorFlow入门教程
- JVM-class文件完全解析-方法表集合
- SpringBoot+pagehelper分页之后还显示全部数据(分页不管用)的解决方案
- k8s 安装nfs_K8s--06 K8s数据持久化
- 用python打印九九乘法表while_利用Python循环(包括whilefor)各种打印九九乘法表的实例...
- 数值计算方法(二)——复化求积公式
- TensorFlow 学习指南 四、分布式
- mysql 表的存储类型_MySQL的表类型和存储引擎
- Oracle调优检查点
- 玩转Vagrant之工作环境的迁移(box的导入与导出)
- 聪明的猴子(BZOJ 2429)
- itext合成pdf报异常 PDF header signature not found
- 安卓通过SQLite实现登录注册功能(小白式教程)
- SQL 中INSERT INTO 的使用方法
- 【应用随机过程】04. 马尔可夫链的平稳分布
- 【Microsoft Azure 的1024种玩法】四. 利用Azure Virtual machines 打造个人专属云盘,速度吊打某云盘...
- 微信小程序集成实时音视频通话功能
热门文章
- C语言 goto 语句 - C语言零基础入门教程
- c语言创建一个hello.txt文件,并检查是否成功,广东工业大学C语言验(上机)任务书2015版.doc...
- scala java抽象理解_Scala之类、特质和抽象类
- java不显示图片_Java图片显示不出来,怎么解决
- c语言中如何打出草花图案,C语言程序设计程设计题目1.doc
- mysql2800_mysql error 1045 (2800):。。 'root'@'localhost' (using password:YES)
- 投票选举 算法_区块链主流共识算法一文全通
- android car bt模块,大谷蓝牙小车BT Car/Android Car手机控制 重力控制小车 安卓操控小车...
- php header什么意思,php header是什么意思
- JSP 编译原理:JSP 是 Servlet?如何用 Eclipse 查看 JSP 编译生成的 Servlet 源文件?