Description

张老师根据自己工作的需要,设计了一种特殊的二叉搜索树。他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,…,n),其中数字1,2,3,…,n 是每个结点的编号。n个结点恰好对应于一组学术论文中出现的n个不同的单词。第j个单词在该组论文中出现的次数记为dj,例如,d2=10表示第2个结点所对应的单词在该组论文中出现了10次。设该组论文中出现的单词总数为S,显然,S=d1+d2+…+dn。记fj=dj/S为第j个单词在该组论文中出现的概率(频率)。 张老师把根结点深度规定为0,如果第j个结点的深度为r,则访问该结点的代价hj为hj=k(r+1)+c,其中k,c为已知的不超过100的正常数。 则zh_tree是满足以下条件的一棵二叉树:它使 h1f1+h2f2+…+hnfn 达到最小。我们称上式为访问zh_tree的平均代价。 请你根据已知数据为张老师设计一棵zh_tree。

Input

第1行:3个用空格隔开的正数: n k c 其中n<30,为整数,k,c为不超过100的正实数。 第2行:n个用空格隔开的正整数,为每个单词出现的次数(次数<200)。

Output

第1行:(5分)一个正实数,保留3位小数,为访问Zh_tree的最小平均代价。 第2行:(5分)n个用空格隔开的整数,为该树的前序遍历。一般地,作为最优解的前序遍历不一定唯一,只输出一个解。

Sample Input

4 2 3.5
20 30 50 20

Sample Output

7.000
题解:这道题的答案神奇般的自动忽略了的第二个问题,并没有输出前序遍历,不过这也为我们减小了难度,所以我们也愉快地跟着忽略吧。。。
我们枚举三个数x,y,z,设f[i][j][x]为当以i~j节点为一棵树且根节点的深度为x时,访问这棵树的最小代价,然后再去枚举这段区间内的根节点k,因为是中序遍历,所以确定k后左边一定是左子树,右边一定是右子树。这样我们只需要加上左边和右边的最优解和访问k本身的代价,即为一种可能性,寻找最优可能性。
具体程序注释。
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<string>
using namespace std;
int n,j;
float a[],s,k1,c,f1[],f[][][];//定义为实数
int main()
{
cin>>n>>k1>>c;
for (int i=;i<=n;i++)
{
cin>>a[i];
s+=a[i];
}
for (int i=;i<=n;i++) f1[i]=a[i]/s;//因为概率是不变的,所以我们一开始就计算出各个点的概率
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
for (int x=;x<=n-;x++)
f[i][j][x]=;//初始化
for (int i=;i<=n+;i++)
for (int x=;x<=n-;x++)
f[i][i][x]=(k1*(x+)+c)*f1[i];//单单一个点为一棵树的时候先计算出值
for (int i=;i<=n+;i++)
for (int x=;x<=n;x++)
f[i][i-][x]=;//指当我们在枚举区间时考虑把边界i或j当做根节点时,即没有左子树或右子树的时候,就会调用到f[i][i-1][x],因为没有所以值自然为0;
for (int len=;len<=n;len++)//枚举区间
for (int i=;i<=n-len+;i++)
{
j=i+len-;
for (int x=;x<=n-;x++)
for (int k=i;k<=j;k++)//枚举区间内的根节点
{
f[i][j][x]=min(f[i][j][x],f[i][k-][x+]+f[k+][j][x+]+(k1*(x+)+c)*f1[k]);//两边的加上本身的;
}
}
printf("%.3f",f[][n][]);//保留三位小数输出
return ;
}

BZOJ1261: [SCOI2006]zh_tree的更多相关文章

  1. bzoj千题计划184:bzoj1261: [SCOI2006]zh_tree

    http://www.lydsy.com/JudgeOnline/problem.php?id=1261 dp[l][r][dep]  区间[l,r]内的节点,根在dep层的最小代价 枚举根i,dp[ ...

  2. BZOj1261: [SCOI2006]zh_tree(dp)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 400  Solved: 272[Submit][Status][Discuss] Descriptio ...

  3. BZOJ 1261: [SCOI2006]zh_tree( 区间dp )

    dp(l, r)表示[l, r]这段作为一棵树的最小访问代价. 对于dp(l, r), 我们枚举它的根x, 则dp(l, r) = min(dp(l, x-1)+dp(x+1, r)+C*fx) + ...

  4. 「 洛谷 」P4539 [SCOI2006]zh_tree

    小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...

  5. 【DP】【P4539】 [SCOI2006]zh_tree

    Description 张老师根据自己工作的需要,设计了一种特殊的二叉搜索树. 他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,-,n),其中数字1 ...

  6. 区间DP复习

    区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [ ...

  7. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. BZOJ1263: [SCOI2006]整数划分

    1263: [SCOI2006]整数划分 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 677  Solved: 332[Submit][Status] ...

随机推荐

  1. arguments 对象

    在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象 arguments[0],arguments.length arguments是什么? 答:1:arguments是 ...

  2. 【C#】项目优化实战

    [C#]项目优化实战 一. 数据库设计 1. 常量的枚举值直接存中文不要存数字(注意是常量,如果显示值可变就不能) 例如:男女,在数据库中不要存1和0,直接存男和女. 这样的好处:读取数据的时候可以避 ...

  3. exception 'yii\base\ErrorException' with message 'Class 'MongoClient' not found'

    问题描述: 本来项目运行的好好的,搬了一次办公室(电脑主机一起搬的),第二天的时候就登录不了了. php版本和扩展没有改变,且没有修改任何配置,我尝试重启php5-fpm 服务,又重启nginx服务, ...

  4. A*搜索

    1,从点A开始,并且把它作为待处理点存入一个"开启列表".开启列表就像一张购物清单.尽管现在列表里只有一个元素,但以后就会多起来.你的路径可能会通过它包含的方格,也可能不会.基本上 ...

  5. notepad++的CoolFormat代码格式化插件使用

    因为notepad++的NppAStyle插件只支持格式化C.C++.C#.Java这四种编程语言的代码,所以本人推荐使用这个CoolFormat的插件,相比于NPPAStyle,CoolFormat ...

  6. 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()

    在子线程中new一个Handler为什么会报以下错误? java.lang.RuntimeException:  Can't create handler inside thread that has ...

  7. submit 读取mb52数据

    方法一: data:list_tab type table of abaplist.   data:vlist(300) type c occurs 0 with header line. submi ...

  8. iOS相册中图片按照时间排序

    ios相册默认是按照时间从过去到现在排列,图片顺序有正序和逆序,group可以用以下方法来选择顺序 /** @param NSIndexSet 需要获取的相册中图片范围 @param NSEnumer ...

  9. 全栈开发必备的10款Sublime Text 插件

    Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.Sublime Text 更妙的是它的可扩展性.所以,这里挑选了全栈开发必备的10款 Sublime T ...

  10. oracle10g、oracle client和plsql devement 三者之间的关系

    oracle10g是服务器,如果本机安装了oracle10g,没有必要安装oracle client,只要配置好DNS,就可以使用plsql devement连接     当然你也可以同时安装orac ...