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


题意非常的复杂,考虑转化一下:
每次选择一个叶节点,删除本叶节点(深度为$dep$)的同时,加入两个深度为$dep + 1$的叶节点,重复$n$轮
首先考虑第$1$问,(你看我这种人相信数据绝对是最大的数据,直接$f[i][S]$表示$i$个叶子结点,深度之和为$j$的时候的概率,然后化前缀和化出来...)
对于一个深度为$x$的点,对它操作后,深度增加了$2 * (x+ 1) - x = x +2$
现在考虑平均的情况,令$f[i]$表示$i$个节点的平均深度,那么$f[i] = \frac{f[i - 1] *(i - 1) + f[i - 1] + 2}{i} = f[i - 1] + \frac{2}{i}$
其中,$f[i - 1] * (i - 1)$表示原来的总深度,$ / i$表示新的平均个数
边界为$f[1] = 0$(注意题目中深度的定义)
接着是第$2$问,考虑求解$f[i][j]$表示$i$个叶节点的树,深度为$j$的概率
那么$E(X) = \sum\limits_{i = 0}^n i * f[n][i]$
只要考虑怎么转移,自然地想到全概率公式,有
$f[i][j] = \sum\limits_{L = 1}^{i - 1} p[i][L] \sum\limits_{x = 1}^j \sum\limits_{y = 1}^j f[L][x] * f[i - L][y](x = j - 1 || y = j - 1)$
其中,$p[i][L]$表示$i$个叶子结点的树,有$L$个叶子结点落在左边的概率
同时, 注意右子树至少有$1$个叶子结点
那么,这是一个$O(n^4)$的算法
考虑进行优化,令$g[i][j] = \sum\limits_{i = 1}^j f[i][j]$
那么,现在我们的转移式变为了$f[i][j] = \sum\limits_{L = 1}^{i - 1} p[i][L] * (2 *f[L][j - 1] * g[i - L][j - 1] - f[L][j - 1] * f[i - L][j - 1])$
现在,只要求出$p[i][L]$,我们就得到了一个$O(n ^ 3)$的算法
而我们可以使用数学归纳法证明(不难)
$p[i][L] = \frac{1}{i - 1} (1 \leq L \leq i - 1)$
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define ri register int
#define de double
#define sid 105 int q, n;
de ans, f[sid][sid], g[sid][sid]; int main() {
cin >> q >> n;
if(q == ) {
for(ri i = ; i <= n; i ++) ans += 2.0 / i;
printf("%lf\n", ans);
}
else {
f[][] = ;
for(ri i = ; i <= n; i ++) g[][i] = f[][];
for(ri i = ; i <= n; i ++) {
for(ri s = ; s < i; s ++)
for(ri L = ; L < i; L ++)
f[i][s + ] += ( * f[L][s] * g[i - L][s] - f[L][s] * f[i - L][s]) / (i - );
g[i][] = f[i][];
for(ri s = ; s <= n; s ++) g[i][s] = g[i][s - ] + f[i][s];
}
for(ri i = ; i <= n; i ++) ans += i * f[n][i];
printf("%lf\n", ans);
}
return ;
}
实际上,由于是对$E[X] = \sum\limits_{i = 1}^n i *P(X = i)$进行计数
因此,我们可以把$P(x = i)$拆成$i$份
那么,对$E[X] = \sum\limits_{i = 1}^n P(X \geq i)$计数也是可以的
然而本质没有什么改变...
luoguP3830 [SHOI2012]随机树 期望概率 + 动态规划 + 结论的更多相关文章
- luogu P3830 [SHOI2012]随机树 期望 dp
LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...
- [SHOI2012]随机树[期望dp]
题意 初始 \(1\) 个节点,每次选定一个叶子节点并加入两个儿子直到叶子总数为 \(n\),问叶子节点深度和的平均值的期望以及最大叶子深度的期望. \(n\leq 100\) . 分析 对于第一问, ...
- 洛谷P3830 [SHOI2012]随机树(期望dp)
题面 luogu 题解 第一问: 设\(f[i]\)表示\(i\)步操作后,平均深度期望 \(f[i] = \frac {f[i - 1] * (i - 1)+f[i-1]+2}{i}=f[i-1]+ ...
- 洛谷3830 [SHOI2012]随机树 【概率dp】
题目 输入格式 输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数. 输出格式 输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位.如果 q = 1,则 d 表示叶结 ...
- P3830 [SHOI2012]随机树 题解
P3830 随机树 坑题,别人的题解我看了一个下午没一个看得懂的,我还是太弱了. 题目链接 P3830 [SHOI2012]随机树 题目描述 输入输出格式 输入格式: 输入仅有一行,包含两个正整数 q ...
- [SHOI2012]随机树
[SHOI2012]随机树 题目大意( 网址戳我! ) 随机树是一颗完全二叉树,初始状态下只有一个节点. 随机树的生成如下:每次随机选择一个叶子节点,扩展出两个儿子. 现在给定一个正整数\(n\)(\ ...
- P3830 [SHOI2012]随机树
P3830 [SHOI2012]随机树 链接 分析: 第一问:f[i]表示有i个叶子结点的时候的平均深度,$f[i] = \frac{f[i - 1] + 2 + f[i - 1] * (i - 1) ...
- bzoj2830: [Shoi2012]随机树
题目链接 bzoj2830: [Shoi2012]随机树 题解 q1好做 设f[n]为扩展n次后的平均深度 那么\(f[n] = \frac{f[n - 1] * (n - 1) + f[n - 1] ...
- 【NOIP模拟赛】黑红树 期望概率dp
这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...
随机推荐
- 【IIS】IIS中同时满足集成模式和经典模式
手里有一个项目--系统设置(主要功能是对系统一些字典表的设置.权限管理等功能).在VS上运行没有任何问题.可是发布到IIS上之后,报黄页. 发布后程序运行环境为: windows 7 32位 IIS为 ...
- [NOIP2003]栈 题解(卡特兰数)
[NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序 ...
- redis笔记之两种持久化备份方式(RDB & AOF)
Redis支持的两种持久化备份方式(RDB & AOF) redis支持两种持久化方式,一种是RDB,一种是AOF. RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命 ...
- python3学习笔记.3.条件控制与循环
1.条件控制 关键字 if.elif.else 一般形式如下: if 条件1: 结果1 elif 条件2: 结果2 else: 结果3 注意:条件后的:语句的缩进的是相同的 2.循环语句 关键字有 ...
- 1-spring xml 和 注解 解析过程
spring mvc 入口 DispatcherServlet,类关系图如下所示 DispatcherServlet 就是一个 Servlet,那Servlet 的初始化方法 init()在哪里,通过 ...
- 不相交集ADT--链表实现
每一个集合用用一个链表来表示.链表的第一个对象作为它所在集合的代表.链表中每个对象都包含一个集合成员,一个指向下一个对象的指针,以及指向代表的指针.每个链表含head和tail指针,head指向链表的 ...
- 用Centos7搭建小微企业Samba文件共享服务器【转】
转自 用Centos7搭建小微企业Samba文件共享服务器 - 今日头条(www.toutiao.com)http://www.toutiao.com/i6436937837660078593/ 最近 ...
- 在ubuntu中安装puppeteer
https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md 早些时候puppeteer刚出来,在vps上 ...
- android 动态改变控件位置和大小 .
动态改变控件位置的方法: setPadding()的方法更改布局位置. 如我要把Imageview下移200px: ImageView.setPadding( ImageVie ...
- python从2.6.x升级到2.7.x
[前提] 今日是20171207,目前Linux发行版默认安装的Python版本都是2.6.x,但是这个版本Python已经不再进行维护了. 所以需要将Python做一个升级,到2.7.x [注意] ...