NOIP2003 加分二叉树
http://www.luogu.org/problem/show?pid=1040
题目描述
设一个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个用空格隔开的整数,为该树的前序遍历。
一开始写的是在算可以取得的最大值的时候计算每个节点的左右儿子,然而这个思路并不对...因为数据规模较小,DP求完最大值后可以再记忆化搜索一次来打印先序遍历,因为第一次已经求出了所有情况的值,所以第二次DP很快
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct Node{
int root;
long long val;
};
;
long long mem[maxn][maxn];
int v[maxn][maxn],lson[maxn],rson[maxn],num[maxn],fa[maxn][maxn],n;
int init(){
memset(v,,sizeof(v));
memset(lson,,sizeof(lson));
memset(rson,,sizeof(rson));
memset(fa,,sizeof(fa));
}
Node dp(int l,int r){
if(v[l][r]) return (Node){fa[l][r],mem[l][r]};
v[l][r]=;
,tfa=-;
if(l==r){
mem[l][r]=num[l];
fa[l][r]=l;
return (Node){l,num[l]};
}
tfa=l;ans=dp(l+,r).val+num[l];
).val+num[r];
if(x>ans) ans=x,tfa=r;
;i<r;i++){
x=dp(l,i-).val*dp(i+,r).val+num[i];
if(x>ans) ans=x,tfa=i;
}
,r).root;
).root;
else{
lson[tfa]=dp(l,tfa-).root;
rson[tfa]=dp(tfa+,r).root;
}
mem[l][r]=ans,fa[l][r]=tfa;
return (Node){tfa,ans};
}
void print(int l,int r){
if(l==r){
printf("%d ",l);
return;
}
,r).val+num[l];int f=l;
).val+num[r];
if(x>ans) ans=x,f=r;
;i<r;i++){
x=dp(l,i-).val*dp(i+,r).val+num[i];
if(x>ans) ans=x,f=i;
}
printf("%d ",f);
if(f==l){
print(l+,r);
}else if(f==r){
print(l,r-);
}else{
print(l,f-);
print(f+,r);
}
}
void dfs(int u){
printf("%d ",u);
if(lson[u]) dfs(lson[u]);
if(rson[u]) dfs(rson[u]);
}
int main()
{
scanf("%d",&n);
init();
;i<=n;i++) scanf("%d",&num[i]);
printf(,n).val);
//dfs(dp(1,n).root);
print(,n);
;
}
NOIP2003 加分二叉树的更多相关文章
- cogs 106. [NOIP2003] 加分二叉树(区间DP)
106. [NOIP2003] 加分二叉树 ★☆ 输入文件:jfecs.in 输出文件:jfecs.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 设 一个 n ...
- NOIP2003加分二叉树[树 区间DP]
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- 【题解】NOI2009二叉查找树 + NOIP2003加分二叉树
自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点.在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧) ...
- NOIP-2003 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- NOIP2003加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节点的分数为di,treedi,tree ...
- CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)
CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...
- 加分二叉树 vijos1991 NOIP2003第三题 区间DP/树形DP/记忆化搜索
描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一 ...
- 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的中序遍历为( ...
随机推荐
- html元素背景样式大小调整
定义元素背景设置 background-size属性cover自适应填充背景,background-size: 100% 100%; background-size: 左右比例 上下比例: 再介绍几 ...
- 解决 SQLite数据库 no current row
场景: SQLite数据库,在查询数据时,提示 标题错误异常.查看堆栈,是在SQLiteDataReader.CheckValidRow 时报错. 数据查询是通过 adapter.Fill(dt) 进 ...
- Android一 流
补充Java知识:流 java.io 四个抽象类: 字节流:InputStream OutputStream 字符流:Reader Writer 站在程序角度上,输入(读入到程序)输出(从程序写出) ...
- 黄聪:走进wordpress 详细说说template-loader.php
再看template-laoder.php,这个文件总共只有45行.它的作用是基于访问的URL装载正确的模板. 文件第六行,也是第一条语句,如下: if ( defined('WP_USE_THEME ...
- HelloHibernate详解
1. Configuration管理读取配置文件 //读取src下hibernate.properties,不推荐使用 Configuration cfg = new Configuration(); ...
- JavaScript 中 4 种常见的内存泄露陷阱
了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...
- c++学习-字符串
字符数组和 string类型比较的区别 #include<iostream> #include<string> using namespace std; class area{ ...
- CentOS修改163源(转载)
From:http://www.linuxidc.com/Linux/2012-08/69043.htm #CentOS-Base.repo其他版本文件在http://mirrors.163.com/ ...
- springmvc 注解 RequestParam/RequestHeader/CookieValue
RequestParam注解: 示例: @RequestMapping("/testRequestParam") public String testRequestParam(@R ...
- Delphi调用外部程序函数:WinExec() 和ShellExecute详解
1,WinExec(): WinExec主要运行EXE文件,不能运行其他类型的文件.不用引用特别单元. 原型:UINT WinExec(exePath,ShowCmd) 示例,我想要用记事 ...