NOIP-2003 加分二叉树
题目描述
设一个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 加分二叉树的更多相关文章
- CODEVS1090 加分二叉树
codevs1090 加分二叉树 2003年NOIP全国联赛提高组 题目描述 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点 ...
- Vijos 1100 加分二叉树
题目 1100 加分二叉树 2003年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 设一个n个节点的二叉树tree的中序遍历为( ...
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解
废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms 内存限制: 524288 KB提交数: 121 通过数: 91 [题目描述] 原题来自:NOIP 20 ...
- NOIP2003加分二叉树[树 区间DP]
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- NOIP 2003解题报告
第一题(神经网络): 题目大意,给出一些点,每个点都有2个值,c和u,给出一些有向边,权值为w.入度为0的点的c已知,其它点的c未知,每个入度不为0的点node的c等于sum(c[k]*w[k][no ...
- CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)
CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...
- P1040 加分二叉树
转自:(http://www.cnblogs.com/geek-007/p/7197439.html) 经典例题:加分二叉树(Luogu 1040) 设一个 n 个节点的二叉树 tree 的中序遍历为 ...
- 【洛谷】P1040 加分二叉树
[洛谷]P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数 ...
- 【题解】NOI2009二叉查找树 + NOIP2003加分二叉树
自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点.在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧) ...
随机推荐
- Couldn't get lock for %t/vertx.log
今天在启动vertx框架的项目时,报“Couldn't get lock for %t/vertx.log”的错误. 解决方案: 1,找出vertx.log的目录.一般在(C:\Users\Admin ...
- scrapy使用爬取多个页面
scrapy是个好玩的爬虫框架,基本用法就是:输入起始的一堆url,让爬虫去get这些网页,然后parse页面,获取自己喜欢的东西.. 用上去有django的感觉,有settings,有field.还 ...
- 21个很棒的jQuery分页插件下载
分页是指将一个大内容划分为各种不同的页面,因此网站的分页是一个很重要的部分,必须让内容有组织性和易于访问.分页有各两种不同的方式,手动跟自动.最受欢迎简单和广泛的方法是jQuery插件.下面我们收集了 ...
- python获取对象信息
获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: class Person(object): def ...
- Celery Flower监控,完美搞定
XXXX啊,,从上午就看到QUEQUE有问题,但一直不晓得哪里出了问题, 后来,安装上FLOWER看一下,队列就出来了... 神器啊.. 安装不说,运行很EASY.. celery flower -A ...
- 两种方法,获取磁盘剩余空间--PYTHON
import ctypes import os import platform import sys def get_free_space_mb(folder): """ ...
- 力控ADO组件数据源设置
1.mysql的ODBC驱动如何下载及安装 地址:http://dev.mysql.com/downloads/connector/odbc/5.1.html Mysql跟力控ado进行交互 第一步: ...
- 在html中嵌入markdown
在博客园网页里写markdown的时候, 某些特殊内容想加上自定义的css, 于是用<div class="xxx">包裹起来, 但是发现该<div>中的m ...
- 转:二十七、Java图形化界面设计——容器(JFrame)
转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...
- Oracle坑之-空字符串与NULL
空字符串与NULL 首先有如下代码 SELECT * FROM Pdc_DataDomain DD INNER JOIN Pdc_DD_Table DDT ON DD.DataDomainID = D ...