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]随机树 题解的更多相关文章

  1. P3830 [SHOI2012]随机树

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

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

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

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

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

  4. BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解

    https://www.luogu.org/problemnew/show/P3830#sub   <-题面看这里~ https://www.lydsy.com/JudgeOnline/prob ...

  5. 洛谷 P3830 [SHOI2012]随机树

    https://www.luogu.org/problemnew/show/P3830 具体方法见代码.. 其实挺神奇的,概率可以先算出“前缀和”(A小于等于xxx的概率),然后再“差分”得到A恰好为 ...

  6. 洛谷P3830 [SHOI2012]随机树——概率期望

    题目:https://www.luogu.org/problemnew/show/P3830 询问1:f[x]表示有x个叶节点的树的叶节点平均深度: 可以把被扩展的点的深度看做 f[x-1] ,于是两 ...

  7. luogu P3830 [SHOI2012]随机树

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

  8. bzoj2830: [Shoi2012]随机树

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

  9. [SHOI2012]随机树

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

随机推荐

  1. centos 6.5 ruby环境安装

    redis3.0以上支持集群,自带集群管理工具redis-trib.rb:在搭建集群前,安装ruby环境 ruby安装包下载 安装开发工具 1.命令:yum groupinstall "De ...

  2. golang interface

    接口定义 Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能 包含任何变量. type Interface interface { test1(a, b int) ...

  3. spring中获取dao或对象中方法的实例化对象

    spring中获取dao的中方法的实例化对象: //获取应用上下文对象 ApplicationContext ctx = new ClassPathXmlApplicationContext(&quo ...

  4. vue2.0页面缓存和不缓存的方法

    // 模板中: <div class="home"> <keep-alive> <router-view v-if="$route.meta ...

  5. lua 设置文件运行的环境

    背景 在一个lua文件中书写的代码, 使用的变量, 需要设置其运行环境. 目的: 1. 不破坏全局环境. 2. 限定文件所使用的环境, 作为沙箱功能. 解法 限定运行空间环境的文件: local m ...

  6. sqlserver二进制存储

    CREATE TABLE myTable_yq(Document varbinary(max),yq varchar(20)) --SELECT @xmlFileName = 'c:\TestXml. ...

  7. Flume配置Multiplexing Channel Selector

    1 官网内容 上面配置的是根据不同的heder当中state值走不同的channels,如果是CZ就走c1 如果是US就走c2 c3 其他默认走c4 2 我的详细配置信息 一个监听http端口 然后 ...

  8. js判断浏览器类型和版本

    原网址:http://www.cnblogs.com/rubylouvre/archive/2009/10/14/1583362.html 除了另无它法,肯定不使用navigator.userAgen ...

  9. Shiro入门 - 通过自定义Realm连数数据库进行认证

    添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...

  10. async get_event_loop

    以下论述转载自https://segmentfault.com/q/1010000007863971 答主论述清晰,很不错,可参考他的其他答案 首先,event loop 就是一个普通 Python ...