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/ ...
随机推荐
- 在Windows下安装MongoDB
概述 读者可以通过本文来学习在Windows操作系统上安装MongoDB. 从2.2版本开始,Mongo DB不在支持Windows XP.请使用最近的windows来安装最近发布的MongoDB.本 ...
- dataTables.js 响应式/package-lock.json 作用/eclipse 目录和工作区建立连接/navcat 导出数据库/vscode 快速进入方法
下班时间到啦! --下班都是他们的,而我,什么都没有. 什么周五放松日,什么五四青年节,什么都么有.继续总结一下今天遇到的问题. dataTables.js 响应式 使用dataTables.js创建 ...
- OSCP考试回顾
技术背景 从2011年开始接触学习渗透测试,全职做过的职位有渗透测试,Python后端研发,DevOps,甲方安全打杂. 学习过程 首先考试报名,交钱.买了价值800美元的一个月lab,包含Pente ...
- Linux SCIM/fcitx/ibus 输入法
现在很多发行版linux一般都是装好scim scim-tables-zh 重启就行 但有时重启后还是不能调用 可以用如下方法: 添加文件: sudo gedit /etc/X11/xinit/xin ...
- 【Python学习】字符编码
先说两个基础知识. (1)计算机内部,数据是由0,1组成的: (2)计算机最小的数据单位,就是一个二进制单位即bit,接下来就是8个二进制单位表示一个字节(Byte). 1 ASCII码 ASCII码 ...
- 【Python学习】csv库
csv(Comma-Separated Values, 逗号分割值)是存储表格数据的常用文件格式. 它每一行都用一个换行符分隔,列与列之间用逗号分隔. 本地文件 Python的csv库可以非常简单地修 ...
- elk系列2之multiline模块的使用【转】
preface 上回说道了elk的安装以及kibana的简单搜索语法,还有logstash的input,output的语法,但是我们在使用中发现了一个问题,我们知道,elk是每一行为一个事件,像Jav ...
- python 之ConfigParser模块学习
1.1 读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该secti ...
- 轻量级运维工具-pssh,pscp,prsync,pslurp,pnuke
批量执行,并行传输,远程killall #yum安装 yum install pssh -y #yun安装后pscp改名为pscp.pssh #源码编译 wget https://pypi.pytho ...
- python 多线程, 多进程, 协程
1. 介绍: threading用于提供线程相关的操作,线程是应用程序中工作的最小单元.python当前版本的多线程库没有实现优先级.线程组,线程也不能被停止.暂停.恢复.中断. 2. 1 线程执行 ...