题目描述

设一个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的前序遍历

                                 ————————by洛谷oj

http://www.luogu.org/problem/show?pid=1040



  显然一道树形DP  但与主流树形DP不同的是,本题的具体的树不是条件,而是所求。但好在题中还是给了树的中序遍历的(不然怎么做),于是想到中序遍历的性质,点A的左子树在A左,右子树在A右,再分析题意,显然对于每一个根节点A,她的树的加分在确定了左右儿子和儿子子树的最优加分后即可确定,后者由DP实现,前者则需要分别在两个备选点区间中枚举于是得出状态转移方程

  • f[fa][l][r]=a[fa]+max(f[i][l][fa-1]*f[j][fa+1][r])(i,j)∈{(a,b)|a∈[l,fa-1],b∈[fa+1,r]}

剩下的就是一些个别的处理了,如当fa-1=l或fa+1=r时特别处理下,之类的。

于是本题的第一个任务完成了,剩下建棵树。这也很简单——对于ls[fa][l][r]和rs[fa][l][r],f[fa][l][r]转移自i,j,故ls[fa][l][r]=i,rs[fa][l][r]=j;在DP的同时进行。

代码如下:

#include<cstdio>
using namespace std;
int n;
int a[];
long long f[][][];
int ls[][][],rs[][][]; long long dp(int,int,int);
void dlr(int,int,int);
int main()
{
int i,fa;
long long num=,ans=;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
{
num=dp(,n,i);
if(ans<num)
{
ans=num;
fa=i;
}
}
printf("%lld\n",ans);
dlr(,n,fa);
}
long long dp(int l,int r,int fa)
{
int i,j;
long long ans;
if(f[fa][l][r]!=)
return f[fa][l][r];
f[fa][l][r]=a[fa];
for(i=l;i<fa;i++)
{
for(j=fa+;j<=r;j++)
{
ans=a[fa]+dp(l,fa-,i)*dp(fa+,r,j);
if(f[fa][l][r]<ans)
{
f[fa][l][r]=ans;
ls[fa][l][r]=i;
rs[fa][l][r]=j;
}
}
}
if(l==fa)
{
for(j=fa+;j<=r;j++)
{
ans=a[fa]+dp(fa+,r,j);
if(f[fa][l][r]<ans)
{
f[fa][l][r]=ans;
rs[fa][l][r]=j;
}
}
}
if(r==fa)
{
for(i=l;i<fa;i++)
{
ans=a[fa]+dp(l,fa-,i);
if(f[fa][l][r]<ans)
{
f[fa][l][r]=ans;
ls[fa][l][r]=i;
}
}
}
return f[fa][l][r];
}
void dlr(int l,int r,int fa)
{
printf("%d ",fa);
if(ls[fa][l][r])
dlr(l,fa-,ls[fa][l][r]);
if(rs[fa][l][r])
dlr(fa+,r,rs[fa][l][r]);
}

当然,本题也可写成区间DP;

最后:

祝AC哟;

NOIP-2003 加分二叉树的更多相关文章

  1. CODEVS1090 加分二叉树

    codevs1090 加分二叉树 2003年NOIP全国联赛提高组 题目描述 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点 ...

  2. Vijos 1100 加分二叉树

    题目 1100 加分二叉树 2003年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 设一个n个节点的二叉树tree的中序遍历为( ...

  3. 洛谷P1040 加分二叉树(树形dp)

    加分二叉树 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...

  4. 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解

    废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms         内存限制: 524288 KB提交数: 121     通过数: 91 [题目描述] 原题来自:NOIP 20 ...

  5. NOIP2003加分二叉树[树 区间DP]

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

  6. NOIP 2003解题报告

    第一题(神经网络): 题目大意,给出一些点,每个点都有2个值,c和u,给出一些有向边,权值为w.入度为0的点的c已知,其它点的c未知,每个入度不为0的点node的c等于sum(c[k]*w[k][no ...

  7. CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)

    CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...

  8. P1040 加分二叉树

    转自:(http://www.cnblogs.com/geek-007/p/7197439.html) 经典例题:加分二叉树(Luogu 1040) 设一个 n 个节点的二叉树 tree 的中序遍历为 ...

  9. 【洛谷】P1040 加分二叉树

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

  10. 【题解】NOI2009二叉查找树 + NOIP2003加分二叉树

    自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点.在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧) ...

随机推荐

  1. NodeJS加MongoDB应用入门

    OS:Windows 7 1.下载安装MongoDB:http://www.mongodb.org/downloads 2.下载安装NodeJS:http://nodejs.org/ 3.运行Mong ...

  2. KeepAlive详解

    KeepAlive既熟悉又陌生,踩过坑的同学都知道痛.一线运维工程师踩坑之后对于KeepAlive的总结,你不应该错过! 最近工作中遇到一个问题,想把它记录下来,场景是这样的: 从上图可以看出,用户通 ...

  3. mysql5.7版本无法启动服务问题

    cmd情况下进入mysql的bin目录后 输入命令:mysqld --initialize-insecure d:\mysql\bin

  4. JavaMail 发送邮件

    JavaMail邮件发送 引用maven jar包 <dependency> <groupId>javax.mail</groupId> <artifactI ...

  5. OC修饰词 - 内存管理

    <招聘一个靠谱的 iOS>—参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均 ...

  6. Java多线程初学者指南(10):使用Synchronized关键字同步类方法

    要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() { ... } 从上面的代码可 ...

  7. android recovery模式及ROM制作

    转自android recovery模式及ROM制作 1.总述 为了方便客户日后的固件升级,本周研究了一下android的recovery模式.网上有不少这类的资料,但都比较繁杂,没有一个系统的介绍与 ...

  8. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  9. 李洪强iOS开发Swift篇—08_函数(2)

    李洪强iOS开发Swift篇—08_函数(2) 一.函数类型 函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是 (形参类型列表) -> 返回值类型 1 func sum(num1 ...

  10. bzoj1264

    表面上看这是一道LCS问题 LCS问题O(n2)的复杂度已经很优秀了 而这道题需要O(nlogn)以下的复杂度才能AC 所以我们要找经典问题的特殊性 特殊就在这两个串中,每个数字都是恰好出现5次 不难 ...