P3830 [SHOI2012]随机树 题解
P3830 随机树
坑题,别人的题解我看了一个下午没一个看得懂的,我还是太弱了。
题目链接 P3830 [SHOI2012]随机树
题目描述

输入输出格式
输入格式:
输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数。
输出格式:
输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位。如果 q = 1,则 d 表示叶结点平均深度的数学期望值;如果 q = 2,则 d 表示树深度的数学期望值。
说明



第一问很水,考虑每次新拓展节点就是让树的总深度加上 2
也就是: $$f[i]= \dfrac{f[i-1]*(i-1) + f[i-1] + 2 }{i}$$
意思就是原来 i-1 个节点的平均深度,乘上 (i-1) 变成深度和,然后再加一次 平均深度,然后加 2 ,除以 i 个叶子结点得到当前答案。
化简后式子就变成了: $$f[i]=f[i-1] + \dfrac{2} {i} $$
然后来到第二问(关键问题)。
首先这是概率期望 dp ,于是我们考虑设计状态。
那么我们让 $f[i][j]$ 表示 i 个叶子节点,深度为 j 的概率(是概率)。
那么转移就是: $$ f[i][j] = \dfrac{ f[k][j-1] + f[i-k][j-1]-f[k][j-1] \times f[i-k][j-1] } {i-1} $$
其中 f[i][j] 表示新树状态,f[k][j-1] 为左子树状态,f[i-k][j-1] 为右子树状态。
很多题解到这儿就没了,就没了!也不解释一下的说(尤其 i-1 解释的是真草率)。
最后我自己口胡了一下大概可能也许想通了。
首先 f[i][j] 是我们现在构造出的树的状态,也就是说我们用两个子树拼凑出了一棵新树,而根是新加节点(新加节点会使得左右子树所有叶子结点深度均增加 1 )。
所以这点很重要,也是尤其关键的一步,在强调一遍,f[i][j] 只是代表了新树的形态,且是已经确定了的形态。
那么形成这棵树的概率也就是上面的转移式了,左子树有 j-1 个节点的概率 + 右子树有 j-1 个节点的概率 - 左右子树同时有 j-1 个节点的概率(容斥)。
接着呢? 我们考虑除去 i-1 的意义(自己的想法而已):
我们让当前的这棵树回到上一个状态,也就是说我们令这棵树最后一次叶子结点的扩展取消,回到 i-1 的状态。 (请脑补)
然后聪明的你已经想出来了,这时候要达到当前状态的概率是? 当然是 1/(i-1) 。因为当前这棵树删除的节点扩展回来的概率就是 1/(i-1)。
然后问题就解决了,放代码(非常短啊)。
//by Judge
#include<iostream>
#include<cstdio>
using namespace std;
int q,n; double ans,f[][];
int main(){ scanf("%d%d",&q,&n);
if(q==){
for(int i=;i<=n;++i) ans+=2.0/i;
return printf("%.6lf\n",ans),;
} f[][]=f[][]=f[][]=;
for(int i=;i<=n;++i) for(int j=;j<=n;++j)
for(int k=;k<j;++k) for(int l=;l<i-j;++l)
f[i][max(k,l)+]+=(f[j][k]*f[i-j][l])/(i-);
for(int i=;i<n;++i) ans+=f[n][i]*i; return printf("%.6lf\n",ans),;
}
P3830 [SHOI2012]随机树 题解的更多相关文章
- P3830 [SHOI2012]随机树
P3830 [SHOI2012]随机树 链接 分析: 第一问:f[i]表示有i个叶子结点的时候的平均深度,$f[i] = \frac{f[i - 1] + 2 + f[i - 1] * (i - 1) ...
- luogu P3830 [SHOI2012]随机树 期望 dp
LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...
- 洛谷P3830 [SHOI2012]随机树(期望dp)
题面 luogu 题解 第一问: 设\(f[i]\)表示\(i\)步操作后,平均深度期望 \(f[i] = \frac {f[i - 1] * (i - 1)+f[i-1]+2}{i}=f[i-1]+ ...
- BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
https://www.luogu.org/problemnew/show/P3830#sub <-题面看这里~ https://www.lydsy.com/JudgeOnline/prob ...
- 洛谷 P3830 [SHOI2012]随机树
https://www.luogu.org/problemnew/show/P3830 具体方法见代码.. 其实挺神奇的,概率可以先算出“前缀和”(A小于等于xxx的概率),然后再“差分”得到A恰好为 ...
- 洛谷P3830 [SHOI2012]随机树——概率期望
题目:https://www.luogu.org/problemnew/show/P3830 询问1:f[x]表示有x个叶节点的树的叶节点平均深度: 可以把被扩展的点的深度看做 f[x-1] ,于是两 ...
- luogu P3830 [SHOI2012]随机树
输入格式 输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数. 输出格式 输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位.如果 q = 1,则 d 表示叶结点平均 ...
- bzoj2830: [Shoi2012]随机树
题目链接 bzoj2830: [Shoi2012]随机树 题解 q1好做 设f[n]为扩展n次后的平均深度 那么\(f[n] = \frac{f[n - 1] * (n - 1) + f[n - 1] ...
- [SHOI2012]随机树
[SHOI2012]随机树 题目大意( 网址戳我! ) 随机树是一颗完全二叉树,初始状态下只有一个节点. 随机树的生成如下:每次随机选择一个叶子节点,扩展出两个儿子. 现在给定一个正整数\(n\)(\ ...
随机推荐
- MyEclipse项目中,让修改后的Servlet文件立即运行生效方法
运行的时候用Debug模式发布如图 java 自动生成get set方法的快捷键是什么? Re:在myeclipse中按住shift+alt+s选择 generate getters and sett ...
- java 写一个 map reduce 矩阵相乘的案例
1.写一个工具类用来生成 map reduce 实验 所需 input 文件 下面两个是原始文件 matrix1.txt 1 2 -2 0 3 3 4 -3 -2 0 2 3 5 3 -1 2 -4 ...
- 解决浏览器跨域限制方案之WebSocket
WebSocket是在HTML5中引入的浏览器与服务端的通信协议,可以类比HTTP. 可以在支持HTML5的浏览器版本中使用WebSocket进行数据通信,常见的案例是使用WebSocket进行实时数 ...
- MySQL的随笔
数据库引擎 MySQL5.0支持的存储引擎包括MyISAM,InnoDB.MEMORY.MERGE.BDB等等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表. MyISAM M ...
- 错误 3 未找到类型“sdk:Label”。请确保不缺少程序集引用并且已生成所有引用的程序集。
错误: 错误 3 未找到类型“sdk:Label”.请确保不缺少程序集引用并且已生成所有引用的程序集. 错误 1 命名空间“http://schemas.microsoft.com/winfx/200 ...
- SSH框架的搭建和测试(Spring + Struts2 + Hibernate)
SSH框架实现了视图.控制器.和模型的彻底分离,同时还实现了业务逻辑层与持久层的分离. Spring实现了MVC中的 Controller的功能,Struts实现Web视图的功能,Hibernate则 ...
- Mac 建PHP 环境 及 配置 apache 默认目录
网上找的帮助,试一下,记录在此: 在Mac下配置php开发环境:Apache+php+MySql https://www.imooc.com/article/15705?block_id=tuiji ...
- thc_业务积累
查询医生SQL: select aa.id staffid,bb.property_value staffname from thc_warehouse.staff_record aa inner j ...
- solr window环境安装配置和管理页面基本使用
solr介绍 来自官网http://lucene.apache.org/solr/解释: Solr is highly reliable, scalable and fault tolerant, p ...
- BN_batch normalization
参考: https://zhuanlan.zhihu.com/p/27938792 做法 设,每个batch输入是 (其中每个 都是一个样本, 是batch size) 假如在第一层后加入Batch ...