洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树
题目描述
设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为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个用空格隔开的整数,为该树的前序遍历。
输入输出样例
5
5 7 1 2 10
145
3 1 2 4 5
/*
姿势比较奇特
二叉树的中序遍历是把根节点放在中间
换而言之就是把根节点左右两边的树形序列(子树)合并起来
那么很明显这道题就是一个合并类的区间DP了
和石子合并思路相同,需要注意的是初始状态必须为1(因为是相乘),不然结果会出错
dp[i][j]表示中序遍历i到j最大值
方程:dp[i,j]:=max(dp[i][k-1]*dp[k+1][j]+dp[k][k]
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 101 using namespace std;
int n,num[N][N];
long long f[N][N]; void find(int x,int y)
{
if(x<=y)
{
printf("%d ",num[x][y]);
find(x,num[x][y]-);
find(num[x][y]+,y);
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
{
f[i][j]=;num[i][i]=i;
}
for(int i=;i<=n;i++) scanf("%d",&f[i][i]);
for(int i=n;i>=;i--)
for(int j=i+;j<=n;j++)
for(int k=i;k<=j;k++)
{
if(f[i][j]<(f[i][k-]*f[k+][j]+f[k][k]))
f[i][j]=f[i][k-]*f[k+][j]+f[k][k],
num[i][j]=k; }
printf("%lld\n",f[][n]);find(,n);
return ;
}
洛谷P1040 加分二叉树(区间dp)的更多相关文章
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- P1040 加分二叉树 区间dp
题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...
- [NOIP2003] 提高组 洛谷P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- 洛谷P1040 加分二叉树题解
dp即可 \(f[i][j]\)表示i到j的加分 相当于区间dp了 #include<cstdio> using namespace std; int v[50]; int f[55][5 ...
- 洛谷 P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- 洛谷P1040 加分二叉树【记忆化搜索】
题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...
- [Swust OJ 360]--加分二叉树(区间dp)
题目链接:http://acm.swust.edu.cn/problem/360/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- cogs 106. [NOIP2003] 加分二叉树(区间DP)
106. [NOIP2003] 加分二叉树 ★☆ 输入文件:jfecs.in 输出文件:jfecs.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 设 一个 n ...
随机推荐
- ProE常用曲线方程:Python Matplotlib 版本代码(玫瑰曲线)
Pyplot教程:https://matplotlib.org/gallery/index.html#pyplots-examples 玫瑰曲线 文字描述 平面内,围绕某一中心点平均分布整数个正弦花瓣 ...
- Windows Server 2008无法远程连接
Server 2008 R2依次配置好之后,重启发现总是远程桌面时而连接不上.具体现象如下: 偶尔可以通过桌面远程连接连接到Server.以为是防火墙的问题,各种设置——甚至关闭,依然无法连接.反复重 ...
- 脚本添加删除nginx配置中的内容
[root@nodejs script]# more editnginx.sh #!/bin/bash # function back_check(){ # 备份配置和覆盖配置文件 cp -rf /e ...
- C# 把时间 月 //把第一个0替换为空
string str = "2019-01"; //name: "2019-01月" str = str.Substring(str.Length - , ); ...
- jboss启动问题
今天一大早客户找我,说他们那边的jboss启动成功了,但是却访问不了. 本以为不是什么事,估计又是客户不会搞,把哪里搞挂了,直接远程把客户的jboss的log.data.tmp等文件给清理了,然后重启 ...
- 查询数据表行数 然后循环查找表 添加数据到ITEMS
;i<tbBiao.Rows.Count;i++) { string TableName = (tbBiao.Rows[i]["Table"]).ToString(); tb ...
- 【剑指Offer】剑指offer题目汇总
本文为<剑指Offer>刷题笔记的总结篇,花了两个多月的时间,将牛客网上<剑指Offer>的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于 ...
- 发现是在IE6-IE9下,下列元素table,thead,tfoot,tbody,tr,col,colgroup,html,title,style,frameset的innerHTML属性是只读的
table ID="zhutiTable" html2="<tr></tr>": 的数据 setTableInnerHTML(docu ...
- JS练习:两级联动
代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- 熟悉RHEL7登录界面使用
Linux操作系统提供了图像界面和字符界面两种操作环境. 图像界面: 1.开启RHEL7后进入到该界面,图中用户是我们创建的本地用户,如果我们要以管理员身份登录则点击Not listed(未列出). ...