题目链接:http://acm.swust.edu.cn/problem/360/

Time limit(ms): 1000        Memory limit(kb): 65535
 
Description
设一个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的前序遍历

 
Input
第1行:一个整数n(n<30),为节点个数。 
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。

 
Output
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。 
第2行:n个用空格隔开的整数,为该树的前序遍历。

 
Sample Input
5
5 7 1 2 10
Sample Output
 
 
145
3 1 2 4 5
 
解题思路:区间dp,注意在更新dp值时,标记下根节点方便输出先序遍历,今天才晓得memset居然不能将数组值置为1,汗~~~
 
代码如下:
 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn = , inf = -0x7fffffff;
int n,ptr, vi[maxn], dp[maxn][maxn], root[maxn][maxn];
//若根节点的下标是k,则左端点的是k-1,右端点是k+1;
void PreOrder(int vi, int y){
if (root[vi][y]){
if (ptr++) cout << ' ';
cout << root[vi][y];
PreOrder(vi, root[vi][y] - );
PreOrder(root[vi][y] + , y);
}
} int main(){
//freopen("360-加分二叉树.in","r",stdin);
//freopen("360-加分二叉树.out", "w", stdout);
while (cin >> n){
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
dp[i][j] = ;
for (int i = ; i <= n; i++){
cin >> vi[i];
dp[i][i] = vi[i];
root[i][i] = i;
}
for (int r = ; r <= n; r++){
for (int i = ; i <= n - r; i++){
int j = i + r, tmp = inf;
for (int k = i; k < j; k++){
if (tmp < (dp[i][k - ] * dp[k + ][j] + vi[k])){
tmp = dp[i][k - ] * dp[k + ][j] + vi[k];
root[i][j] = k;
}
}
dp[i][j] = tmp;
}
}
cout << dp[][n] << endl;
ptr = ;
PreOrder(, n);
cout << endl;
}
//fclose(stdin); fclose(stdout);
return ;
}

[Swust OJ 360]--加分二叉树(区间dp)的更多相关文章

  1. P1040 加分二叉树 区间dp

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

  2. 洛谷P1040 加分二叉树(区间dp)

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

  3. cogs 106. [NOIP2003] 加分二叉树(区间DP)

    106. [NOIP2003] 加分二叉树 ★☆   输入文件:jfecs.in   输出文件:jfecs.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 设 一个 n ...

  4. light oj 1422 Halloween Costumes (区间dp)

    题目链接:http://vjudge.net/contest/141291#problem/D 题意:有n个地方,每个地方要穿一种衣服,衣服可以嵌套穿,一旦脱下的衣服不能再穿,除非穿同样的一件新的,问 ...

  5. [luoguP1040] 加分二叉树(DP)

    传送门 区间DP水题 代码 #include <cstdio> #include <iostream> #define N 41 #define max(x, y) ((x) ...

  6. [Swust OJ 402]--皇宫看守(树形dp)

    题目链接:http://acm.swust.edu.cn/problem/402/ Time limit(ms): 5000 Memory limit(kb): 65535   Description ...

  7. [Swust OJ 648]--简单字典(数位dp)

    题目链接:http://acm.swust.edu.cn/problem/0648/ Time limit(ms): 1000 Memory limit(kb): 65535   有这样一本字典,它每 ...

  8. Light OJ 1031 - Easy Game(区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅 ...

  9. Light OJ 1033 - Generating Palindromes(区间DP)

    题目大意: 给你一个字符串,问最少增加几个字符使得这个字符串变为回文串.   ============================================================= ...

随机推荐

  1. 计算机原理学习(2)-- 存储器和I/O设备和总线

    前言 前一篇文章介绍了冯诺依曼体系结构的计算机的基本工作原理,其中主要介绍了CPU的结构和工作原理.这一篇主要来介绍存储区,总线,以及IO设备等其他几大组件,来了解整个计算机是如何工作的. 这些东西都 ...

  2. Redis用户添加、分页、登录、注册、加关注案例

    连接redis代码redis.php <?php //实例化 $redis = new Redis(); //连接服务器 $redis->connect("localhost&q ...

  3. HDU1963 && POJ2063:Investment(完全背包)

    Problem Description John never knew he had a grand-uncle, until he received the notary’s letter. He ...

  4. Heritrix个性化设置抓取目标

    本文是Heritrix的使用的高级篇,针对对Heritrix已经能够运行的码农朋友们! 我们在抓取网页的时候,网页的链接中往往会包含有js.css.图片.视频等文件,第一次执行抓取任务的时候,许多农民 ...

  5. 正整数从1到N,输出按照字典序排序的前K个数

    #include <iostream> #include <cassert> using namespace std; ; char a[max_len]; void topK ...

  6. OSCache缓存框架介绍

          OSCache是一种开放性的JSP定制标记应用,由OpenSymphony设计,提供了在现有JSP页面之内实现快速内存缓冲的功能. OSCache是个一个广泛采用的高性能的J2EE缓存框架 ...

  7. Maven手动创建多模块项目

    Maven手动创建多模块项目 我要创建的项目名称是:unicorn,项目包含两个模块,分别是unicorn-core和unicorn-web.包的路径是com.goldpalm.tour. 项目创建流 ...

  8. MyEclipse中设置智能提示

    在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...

  9. MYSQL @、@@、@x

    说明一: @var这种形式表示的是用户自定义的变量. 说明二: @@var这种形式表示的是系统变量.它又可以分为两种一种是全局(@@global)的一种是会话(@@session)的. 说明三: MY ...

  10. director.js教程

    directive.js 初始化和注册路由 director.js 的主要对象是Router对象,构造方法如下: var router = new Router(routes); //routes为路 ...