题意

初始 \(1\) 个节点,每次选定一个叶子节点并加入两个儿子直到叶子总数为 \(n\),问叶子节点深度和的平均值的期望以及最大叶子深度的期望。

\(n\leq 100\) .

分析

  • 对于第一问,根据答案定义状态 \(f_i\) 表示有 \(i\) 个叶子节点的深度和平均值的期望。

  • 考虑对于之前的每一棵树对期望的贡献,记其发生的概率为 \(p\) ,深度和为 \(w\) ,有 \(i-1\) 个叶子节点。贡献为 \(p*\frac{w}{i-1}\) 。现在要多选定一个叶子节点有 \(i-1\) 种方案,总贡献可以写成:

\[p*\frac{1}{i-1}*\frac{(i-1)w+w+2(i-1)}{i} =\frac{ip\frac{w}{i-1}+2p}{i}
\]

也就有\(f_i=f_{i-1}+\frac{2}{i}\)。

  • 对于第二问,定义状态 \(g_{i,j}\) 表示子树内有 \(i\) 个叶子,最大深度为 \(j\) 的概率。

  • 再定义 \(p_{i,j}\) 表示 \(i\) 个叶子节点有 \(j\) 个在左子树的概率,转移:

\[g_{i,j}=\sum_{l=1}^{i-1}p_{i,l}*\sum_x\sum_y[\max(x,y)+1=j]g_{l,x}*g_{i-l,y}
\]

  • \(p\) 的递推直接枚举最后一个叶子是接在左子树还是右子树即可。

  • 可以前缀和优化,总时间复杂度为 \(O(n^3)\).

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=104;
int type,n;
namespace task1{
double f[N];
void solve(){
f[1]=0;
rep(i,2,n) f[i]=f[i-1]+2.0/i;
printf("%.6lf\n",f[n]);
}
}
namespace task2{
double f[N][N],s[N][N],p[N][N];
void solve(){
p[2][1]=1;
rep(i,3,n)rep(j,1,i-1)
p[i][j]=( p[i-1][j-1]*1.0*(j-1)/(i-1) + p[i-1][j]*1.0*(i-1-j)/(i-1)); f[1][0]=1;rep(j,0,n) s[1][j]=(j?s[1][j-1]:0)+f[1][j];
f[2][1]=1;rep(j,1,n) s[2][j]=s[2][j-1]+f[2][j]; rep(i,3,n){
rep(j,1,i-1){
rep(l,1,i-1)
f[i][j]+=p[i][l]*((j-1>=0?s[l][j-1]:0)*(j-1>=0?f[i-l][j-1]:0)+(j-1>=0?f[l][j-1]:0)*(j-2>=0?s[i-l][j-2]:0));
s[i][j]=s[i][j-1]+f[i][j];
}
fill(s[i]+i,s[i]+1+n,s[i][i-1]);
}
double ans=0;
for(int j=0;j<=n;++j) ans+=f[n][j]*j;
printf("%.6lf\n",ans);
}
}
int main(){
type=gi(),n=gi();
if(type==1) task1::solve();
else task2::solve();
return 0;
}

[SHOI2012]随机树[期望dp]的更多相关文章

  1. luogu P3830 [SHOI2012]随机树 期望 dp

    LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...

  2. 洛谷P3830 [SHOI2012]随机树(期望dp)

    题面 luogu 题解 第一问: 设\(f[i]\)表示\(i\)步操作后,平均深度期望 \(f[i] = \frac {f[i - 1] * (i - 1)+f[i-1]+2}{i}=f[i-1]+ ...

  3. luoguP3830 [SHOI2012]随机树 期望概率 + 动态规划 + 结论

    题意非常的复杂,考虑转化一下: 每次选择一个叶节点,删除本叶节点(深度为$dep$)的同时,加入两个深度为$dep + 1$的叶节点,重复$n$轮 首先考虑第$1$问,(你看我这种人相信数据绝对是最大 ...

  4. P3830 [SHOI2012]随机树 题解

    P3830 随机树 坑题,别人的题解我看了一个下午没一个看得懂的,我还是太弱了. 题目链接 P3830 [SHOI2012]随机树 题目描述 输入输出格式 输入格式: 输入仅有一行,包含两个正整数 q ...

  5. [SHOI2012]随机树

    [SHOI2012]随机树 题目大意( 网址戳我! ) 随机树是一颗完全二叉树,初始状态下只有一个节点. 随机树的生成如下:每次随机选择一个叶子节点,扩展出两个儿子. 现在给定一个正整数\(n\)(\ ...

  6. P3830 [SHOI2012]随机树

    P3830 [SHOI2012]随机树 链接 分析: 第一问:f[i]表示有i个叶子结点的时候的平均深度,$f[i] = \frac{f[i - 1] + 2 + f[i - 1] * (i - 1) ...

  7. bzoj2830: [Shoi2012]随机树

    题目链接 bzoj2830: [Shoi2012]随机树 题解 q1好做 设f[n]为扩展n次后的平均深度 那么\(f[n] = \frac{f[n - 1] * (n - 1) + f[n - 1] ...

  8. 洛谷P3830 随机树(SHOI2012)概率期望DP

    题意:中文题,按照题目要求的二叉树生成方式,问(1)叶平均深度 (2)树平均深度 解法:这道题看完题之后完全没头绪,无奈看题解果然不是我能想到的qwq.题解参考https://blog.csdn.ne ...

  9. 洛谷3830 [SHOI2012]随机树 【概率dp】

    题目 输入格式 输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数. 输出格式 输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位.如果 q = 1,则 d 表示叶结 ...

随机推荐

  1. .Net core 下的ConfigurationManager类正确引用方法

    大家在项目中经常会用到需要引用配置文件的情况,这也是我偶然间遇到的问题,菜鸟一枚,如有需纠正多谢指点. 正题 在不先引用using的情况下直接写 ConfigurationManager.AppSet ...

  2. oracle--ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

    SELECT sid, serial#, username, osuser FROM v$session where sid in(select session_id from v$locked_ob ...

  3. SQL Server客户端工具到底使用的是哪个provider呢?

    SQL Server客户端工具到底使用的是哪个provider呢? 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2013/01/10/sql-server- ...

  4. CISCO ASA 5505 经典配置案例

    nterface Vlan2 nameif outside  ----------------------------------------对端口命名外端口  security-level 0 -- ...

  5. ZooKeeper 数据结构 & 命令

    0. 说明 记录 ZooKeeper 数据结构 & 命令 1. ZooKeeper  数据结构 ZooKeeper 特性: ZooKeeper 文件系统以 / 为根目录,文件系统为树形结构,每 ...

  6. 解决windows下vim中文乱码

    解决windows下vim中文乱码 windows安装了vim8,也就是gvim后,打开带有中文的文档,显示中文是乱码. 毕竟有许多文档我是用utf-8编码的,所以解决的办法是设置一下编码为utf-8 ...

  7. ELK 安装过程补充(不建议看,很少)

    1.yum 安装ELK服务 参考文档:https://blog.csdn.net/tonghudan/article/details/81414387 rpm -Uvh https://dl.fedo ...

  8. Docker容器学习与分享04

    Docker容器的基本操作(2) 基于docker分享03的centos容器,接着学习docker容器的基本操作. docker分享03中创建了一个centos镜像,如果想要查看容器的具体信息就要使用 ...

  9. Oracle 导出用户下的所有索引创建语句

    SELECT dbms_lob.substr(dbms_metadata.get_ddl('INDEX', INDEX_NAME))||';'  from dba_indexes where owne ...

  10. MySQL Error Code文档手册---摘自MySQL官方网站

    This chapter lists the errors that may appear when you call MySQL from any host language. The first ...