描述

设一个n个节点的二叉树tree的中序遍历为(l,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的前序遍历

知道[x,y]的中序遍历,那么对于任意的 k∈[x,y],可以把x到y形成的(子)树分为 [x,k-1] 的左子树与 [k+1,y] 的右子树,k为根节点。然后根据题意求解后,记录最优解即可。

对于一个求到的最优解[x,y]-k,我们就记录[x,y]区间的最优解的根是k,给遍历的时候用。

下面copy一段某神犇的话

我们知道因为该二叉树的中序遍历为1....n
根节点的选取其实有无数种情况
那我们就递归枚举所有可能的根节点比较所能得到的最大值
我们设f[i][j]表示i结点到j结点的加分二叉树所能达到的最大加分值
root[i][j]=k表示该最大加分值是在根节点为k的时候达到的
那么我们就可以得到下面的状态转移方程
f[i][j]=max(f[i][k-1]*f[k+1][j]+d[k],i<=k<=j)
注意边界子树为空时加分值为1

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
template<class T> inline void read(T &_a){
bool f=0;int _ch=getchar();_a=0;
while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();}
while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();}
if(f)_a=-_a;
} long long ans,a[31],n,dp[31][31],root[31][31]; void print(int l,int r)
{
if(l>r) return ;
int res=root[l][r];
printf("%d ",res);
print(l,res-1);
print(res+1,r);
} int main()
{
read(n);
for (register int i=1;i<=n;++i) read(a[i]);
for (register int i=1;i<=n;++i) dp[i][i]=a[i],root[i][i]=i;
for (register int i=1;i<n;++i)
for (register int v=1;v+i<=n;++v)
for (register int j=0;j<=i;++j)
{
long long tmp=(dp[v][v+j-1]==0?1:dp[v][v+j-1])*(dp[v+j+1][v+i]==0?1:dp[v+j+1][v+i])+a[v+j];
if(tmp>dp[v][v+i]) dp[v][v+i]=tmp,root[v][v+i]=v+j;
}
printf("%lld\n",dp[1][n]);
print(1,n);
return 0;
}

转载于:https://www.cnblogs.com/jaywang/p/7768223.html

加分二叉树 vijos1991 NOIP2003第三题 区间DP/树形DP/记忆化搜索的更多相关文章

  1. poj1191 棋盘分割【区间DP】【记忆化搜索】

    棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16263   Accepted: 5812 Description ...

  2. 2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

    邱老师降临小行星 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...

  3. 【区间dp】【记忆化搜索】UVALive - 3516 - Exploring Pyramids

    f(i,j)=sum(f(i+1,k-1)*f(k,j) | i+2<=k<=j,Si=Sk=Sj). f(i+1,k-1)是划分出第一颗子树,f(k,j)是划分出剩下的子树. #incl ...

  4. 洛谷P1040 加分二叉树【记忆化搜索】

    题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...

  5. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  6. 记忆化搜索 codevs 2241 排序二叉树

    codevs 2241 排序二叉树 ★   输入文件:bstree.in   输出文件:bstree.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 一个边长为n的正三 ...

  7. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  8. lightoj 1283 - Shelving Books(记忆化搜索+区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1283 题解:这题很显然一看就像是区间dp,但是单纯的区间dp好像解决不了问题可 ...

  9. 线性dp(记忆化搜索)——cf953C(经典好题dag和dp结合)

    非常好的题!和spoj 的 Mobile Service有点相似,用记忆化搜索很容易解决 看了网上的题解,也是减掉一维,刚好可以开下数组 https://blog.lucien.ink/archive ...

随机推荐

  1. 基于 HTML5 WebGL 的 水泥工厂可视化系统

    前言 如今的制造行业,基于数据进行生产策略制定与管理已经成为一种趋势,特别是 工业4.0 的浪潮下,数据战略已经成为很多制造企业的优先战略,而数据可视化以更直观的方式,帮助指导决策,成为数据分析传递信 ...

  2. matplotlib BlendedAffine2D 和 CompositeAffine2D

    2020-04-11 10:00:01 --Edit by yangrayBlendedAffine2D 继承于Affine2DBase,支持x和y方向使用不同的仿射变换策略.(自译:混合仿射变换)C ...

  3. 一个hql 关键字member(非mysql)引起的 vo 数据 保存数据库错误

    2015-03-19 14:16:29,285 ERROR [Thread-3] (DAOHelper.java:312) - updateByEntityPK:com.agileeagle.dao. ...

  4. Arthas-Java的线上问题定位工具

    Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar ...

  5. matlab计算样本熵

    计算14通道得脑电数据吗,将得出的样本熵插入Excel表格 a = zeros(1,14); b = a'; for i =1:14 b(i) = SampEn(d1_1(i,1:3000),2,0. ...

  6. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  7. L18 批量归一化和残差网络

    批量归一化(BatchNormalization) 对输入的标准化(浅层模型) 处理后的任意一个特征在数据集中所有样本上的均值为0.标准差为1. 标准化处理输入数据使各个特征的分布相近 批量归一化(深 ...

  8. stand up meeting 12/21/2015

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  完成PDF UI主页面的页面切换功能,待完善    4  完善 ...

  9. ubuntu允许root远程登录

    之前说了,怎么设置root用户登录,但是使用Xshell等工具操作Ubuntu,用户登录不进去,原因很简单,没有开启root登录的权限. 1.检查ssh服务是否开启 使用以下命令,查看是否开启 ps ...

  10. python_ck01(虚拟环境管理)

    拖拖拉拉的毛病还是依旧如初... 断断续续坚持三天总算把虚拟环境管理部分的内容给看完了. 对三天的知识点进行梳理,方便以后回顾. ①虚拟环境安装 用pip install + 包名的方式安装,涉及到的 ...