TYVJ P1073 加分二叉树 Label:区间dp
背景
NOIP2003 提高组 第三道
描述
设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为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个用空格隔开的整数,为该树的前序遍历。
测试样例1
输入
5
5 7 1 2 10
输出
145
3 1 2 4 5
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N,f[][],p[][],v[]; void print(int l,int r){
printf("%d ",p[l][r]);
if(l<=p[l][r]-) print( l ,p[l][r]-);
if(p[l][r]+<=r) print( p[l][r]+ ,r );
} int dp(int l,int r){
if(l>r) return ;
if(l==r){
p[l][r]=l;
return v[l];
}
if(f[l][r]>=) return f[l][r]; for(int k=l;k<=r;k++){
if(dp(l,k-)*dp(k+,r)+v[k]>f[l][r]){
f[l][r]=dp(l,k-)*dp(k+,r)+v[k];
p[l][r]=k;
}
}
return f[l][r];
} int main(){
// freopen("01.txt","r",stdin);
memset(f,-,sizeof(f));
scanf("%d",&N);
for(int i=;i<=N;i++) scanf("%d",&v[i]); printf("%d\n",dp(,N));
print(,N);
puts(" "); return ; }额,这一题耗了我很久时间,原因是二叉树问题没搞懂:
不懂的童鞋看这里:二叉树遍历入门之入门(http://www.cnblogs.com/radiumlrb/p/5790331.html)
刚写的
差不多看完就知道这题怎么做的了!
p数组记录路径,f记录当前子树根节点
dp函数算最大值并记录路径
print函数打印路径
TYVJ P1073 加分二叉树 Label:区间dp的更多相关文章
- NOIP2003加分二叉树[树 区间DP]
		
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
 - 【Luogu】P1040加分二叉树(区间DP)
		
题目链接 区间DP,因为中序遍历的性质:区间[l,r]的任何一个数都可以是该区间的根节点. 更新权值的时候记录区间的根节点,最后DFS输出. 见代码. #include<cstdio> # ...
 - P1040 加分二叉树(区间DP)
		
(点击此处查看原题) 解题思路 题目已经给出了树的中序遍历,因此我的想法是利用中序遍历的特点:若某子树的根结点为k,那么k之前的结点组成这一子树的左子树,k之后的结点组成这一子树的右子树,可以通过不断 ...
 - TYVJ P1078 删数 Label:区间dp
		
描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...
 - 洛谷P1040 加分二叉树(树形dp)
		
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
 - tyvj 1198 矩阵连乘——区间dp
		
tyvj 1198 矩阵连乘 题目描述 一个n*m矩阵由n行m列共n*m个数排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算 ...
 - TYVJ P1047 乘积最大 Label:dp
		
背景 NOIP 2000 普及组 第三道 描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力 ...
 - TYVJ P1075 硬币游戏 Label:dp
		
背景 农民John的牛喜欢玩硬币,所以John就为它们发明了一个新的两人硬币游戏,叫做Xoinc. 描述 最初地面上有一堆n个硬币(5<=n<=2000),从上面数第i个硬币的价值为C_i ...
 - VJP1100 加分二叉树(树形DP)
		
链接 归属树形DP 做着更像记忆化 DP很好做 就是那个输出路径恶心了..改代码 从60多行改到120多行..dp从1维加到三维.. 先类似记忆化搜索整棵树 枚举以i为根节点的最大值 子树类似 求完 ...
 
随机推荐
- 黑客讲述渗透Hacking Team全过程(详细解说)
			
近期,黑客Phineas Fisher在pastebin.com上讲述了入侵Hacking Team的过程,以下为其讲述的原文情况,文中附带有相关文档.工具及网站的链接,请在安全环境下进行打开,并合理 ...
 - 阿里云服务器配置 SVN 服务器与生产站点同步
			
作为linux的门外汉,一直觊觎svn的方便性,在有台aliyun的情况下,一起来搞搞. 1.环境 阿里云 centos5.5 2.安装svn yum -y install subve ...
 - 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二)  nyoj 14会场安排问题
			
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
 - 使用nginx的proxy_cache做网站缓存
			
为什么要做web cache,我想大家最主要的是解决流量的压力.随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力.与此同时某些网站的页面 ...
 - 《ASP.NET MVC4 WEB编程》学习笔记------Web API
			
本文截取自情缘 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集 ...
 - 《ASP.NET1200例》未能找到元数据文件解决办法
			
今天在做一个项目的时候,遇到这样的一个问题,我用的是三层结构的.未能找到元数据文件“D:\SYSTEM\桌面\MyExam\MyExam\MyExamBLL\bin\Debug\BLL.dl ...
 - Android dp px转化公式
			
// DisplayMetrics metrics = getResources().getDisplayMetrics(); // int statusBarHeight = (int) Math. ...
 - mysql 我的学习
			
安装要求 安装环境:CentOS-6.3安装方式:源码编译安装 软件名称:mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz下载地址:http://mysql ...
 - 为eclipse设置好看的代码主题
			
eclipse的默认代码背景是白色,上个文章简单说了字体设置,这边主要介绍代码高亮的主题设置,打造更酷的编程界面.网上有文章说可以在设置里面逐一设置,但是比较麻烦,可以去网上下载现成的主题包,网址为: ...
 - JS Replace 全部替换字符 用法
			
转载自:http://www.cnblogs.com/skykang/archive/2011/08/04/2127158.html <script language="javascr ...