[SHOI2012]随机树[期望dp]

时间:2022-03-09 20:19:21

题意

初始 \(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 &lbrack;SHOI2012&rsqb;随机树 期望 dp

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

  2. 洛谷P3830 &lbrack;SHOI2012&rsqb;随机树&lpar;期望dp&rpar;

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

  3. luoguP3830 &lbrack;SHOI2012&rsqb;随机树 期望概率 &plus; 动态规划 &plus; 结论

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

  4. P3830 &lbrack;SHOI2012&rsqb;随机树 题解

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

  5. &lbrack;SHOI2012&rsqb;随机树

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

  6. P3830 &lbrack;SHOI2012&rsqb;随机树

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

  7. bzoj2830&colon; &lbrack;Shoi2012&rsqb;随机树

    题目链接 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 &lbrack;SHOI2012&rsqb;随机树 【概率dp】

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

随机推荐

  1. Swift微博项目--Swift中通过类名字符串创建类以及动态加载控制器的实现

    Swift中用类名字符串创建类(用到了命名空间) OC中可以直接通过类名的字符串转换成对应的类来操作,但是Swift中必须用到命名空间,也就是说Swift中通过字符串获取类的方式为NSClassFro ...

  2. JavaScript 之 执行前台函数

    1.OnClientClick (vs2003不支持这个方法) <asp:Button ID="Button" runat="server" Text=& ...

  3. PowerDesigner的数据类型

    用PowerDesigner 15 设计个数据库,每个字段的数据类型设计真是头大,根据字段意思看用哪个类型最合适还得仔细研究呀.贴几个数据类型表格收藏一下^_^ Numeric data types ...

  4. Android——用户登陆及用户名和密码的保存

    Android——用户登陆及用户名和密码的保存   在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...

  5. 配置IIS提示打开目录浏览时的问题:未能从程序集&OpenCurlyDoubleQuote;System&period;ServiceModel&comma; Version&equals;3&period;0&period;0&period;0”中加载类型&OpenCurlyDoubleQuote;System&period;ServiceModel&period;Activation&period;HttpModule” 的解决办法

    错误消息: 未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的 ...

  6. Inno Setup入门(二十一)&mdash&semi;&mdash&semi;Inno Setup类参考(7)

    Install Setup 2013-02-02 11:31 378人阅读 评论(0) 收藏 举报 复选框 复选框(CheckBox)用于多个并不互斥的几个选项中作出一个或者多选择,例如字体可以有粗体 ...

  7. 记一次被yield return坑的历程。

    事情的经过是这样的: 我用C#写了一个很简单的一个通过迭代生成序列的函数. public static IEnumerable<T> Iterate<T>(this Func& ...

  8. SQL数据库日志清理

    USE [master] GO ALTER DATABASE HCPM_01_181230 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE HCP ...

  9. domain or business logic

    Here are a few of the questions you should ask when writing business logic: ¡Do you fully understand ...

  10. 关于AndroidStudio的打包数字签名以及多渠道发布

    AndroidStudio右侧Gradle里边的build(工程下的)是可以生成未签名的debug和release的apk包生成前可以先clean一下工程 app下的build.gradle里边的 l ...