[OI] 二项式期望 DP
OSU
OSU 的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有 \(size^{3}\) 的贡献,求总期望
关于此题我曾写过题解 此处
此类题的关键之处在于,当我们设计了一个线性状态 \(f_{i}\) 之后,假如我们基于拼接的思想,尝试维护出来了当前最近的一个连通块个数为 \(x\),其贡献应为 \(x^{3}\),那么现在我们再为其拼接一个块,贡献就会变为 \((x+1)^3\),即 \(x^{3}+3x^{2}+3x+1\),注意到这里还有我们尚未维护的 \(x^{2}\) 与 \(x\) 项,因此我们还需要维护这两种信息才能对 \(x^{3}\),进行转移. 对于 \(x^{2}\) 的维护,显然 \((x+1)^{2}=x^{2}+2x+1\),因此只需要维护 \(x\) 项即可,对于 \(x\) 的维护是显然的
引入两个变量 \(l_{i},s_{i}\),其中 \(f_{i}\) 表示考虑前 \(i\) 个,与 \(i\) 联通的连通块长度,\(s_{i}\) 表示前 \(i\) 个的总得分
容易想到 \(l_{i}\) 的转移:当第 \(i\) 个为断点时将 \(l_{i}\) 置零,否则 \(l_{i}=l_{i-1}+1\)
考虑 \(s_{i}\) 的转移:容易想到,当 \(i\) 为断点时有 \(s_{i}=s_{i-1}\),否则,我们可以得出 \(s_{i-1}=(l_{i-1})^{3}+S\)(其中 \(S\) 是一个之前累积的得分),而 \(s_{i}=(l_{i})^{3}+S\),根据上述 \(l_{i}\) 的转移式我们可以知道 \(l_{i}=l_{i-1}+1\),因而有:
\]
因为 \(S\) 不好维护,考虑对两项做差分,消掉 \(S\)
\]
因此,我们只需要维护出 \(l_{i}\),即可递推求解 \(s_{i}\)
下面我们来加上概率考虑
期望有一个性质(期望的线性性)\(E(a+b)=E(a)+E(b)\) ,因此有下述转化:
\]
对于 \(i\) 确定为断点的情况,我们有 \(l_{i}=0\),因此 \(E((l_{i-1})^2)=E(l_{i-1})=0\),从而 \(E(s_{i})=E(s_{i-1})\)
否则,对于 \(i\) 确定联通的情况同理,有 \(E(s_{i})=E(s_{i-1})+3(l_{i-1})^{2}+3l_{i-1}\)
否则,对于随机选择的块,直接用上述两种情况乘对应的概率即可,即:
\]
注意到我们还没有维护 \(E(l_{i})\)
对于 \(i\) 确定为断点的情况,\(E(l_{i})=0\)
对于 \(i\) 确定联通的情况,\(E(l_{i})=E_{l_{i-1}+1}=E(l_{i-1})+1\)
否则,按照上述思路,应为
\]
接着考虑维护 \(E((l_{i})^{2})\)
对于 \(i\) 确定为断点的情况,\(E((l_{i})^{2})=0\)
对于 \(i\) 确定联通的情况,\(E((l_{i})^{2})=E_{(l_{i-1}+1)^{2}}=E((l_{i-1}^{2}+2l_{i-1}+1))=E((l_{i-1}^{2}))+2E(l_{i-1})+1\)
否则,按照上述思路,应为
\]
因为已经维护过了 \(E(l_{i})\),因此至此我们完成了全部变量的维护
#include<bits/stdc++.h>
using namespace std;
int n;
double p[100001],l1[100001],l2[100001],s[100001];
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>p[i];
}
for(int i=1;i<=n;++i){
l1[i]=p[i]*(l1[i-1]+1);
l2[i]=p[i]*(l2[i-1]+2*l1[i-1]+1);
s[i]=(1-p[i])*s[i-1]+p[i]*(s[i-1]+3*l2[i-1]+3*l1[i-1]+1);
}
printf("%.1lf",s[n]);
}
Another OSU
OSU 的 \(k\) 次幂升级版,即贡献变为了 \(x^{k}\)
这一次我们不能再像上述一个一个推式子了,我们需要找一个普遍的规律:
对于刚才的问题我们发现:要想维护一个 \(x^{k}\) 的贡献,显然需要维护 \(k'\in[1,k]\) 的所有 \(x^{k'}\) 的贡献
有二项式定理,即 \((x + y)^n = \sum_{i = 0}^n C_{n}^i x^{n - i} y^{i}\),考虑设 \((f_{i})^{k}\) 为我们对 \(x_{k}\) 项进行的位置为 \(i\) 的转移,效仿刚才的解法,我们会有:
\]
可以发现在这里实际上用到了全部次数比它低的 \(f_{i}\),因此对于每一个 \(i\),按 \(k\) 从小到大维护即可.
此外,除了用二项式定理求 \(C^{i}_{n}\),还可以用杨辉三角来求系数:
杨辉三角递推式:
\]
[OI] 二项式期望 DP的更多相关文章
- 概率及期望DP小结
资源分享 26 个比较概率大小的问题 数论小白都能看懂的数学期望讲解 概念 \(PS\):不需要知道太多概念,能拿来用就行了. 定义 样本(\(\omega\)):一次随机试验产生的一个结果. 样本空 ...
- 【算法学习笔记】概率与期望DP
本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 832 Solved: 5 ...
- 期望dp BZOJ3450+BZOJ4318
BZOJ3450 概率期望DP f[i]表示到i的期望得分,g[i]表示到i的期望长度. 分三种情况转移: ① s[i]=‘x’:f[i]=f[i-1],g[i]=0 ② s[i]=‘o’:f[i]= ...
- HDU 4405 期望DP
期望DP算是第一题吧...虽然巨水但把思路理理清楚总是好的.. 题意:在一个1×n的格子上掷色子,从0点出发,掷了多少前进几步,同时有些格点直接相连,即若a,b相连,当落到a点时直接飞向b点.求走到n ...
- POJ 2096 【期望DP】
题意: 有n种选择,每种选择对应m种状态.每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等. 求n种选择和m种状态中每种至少发生一次的期望. 期望DP好别扭啊.要用倒推的方法. dp[i ...
- ZOJ 3822 Domination 期望dp
Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...
随机推荐
- Python 正则表达式实战之Java日志解析
需求描述 基于生产监控告警需求,需要对Java日志进行解析,提取相关信息,作为告警通知消息的内容部分. 提取思路 具体怎么提取,提取哪些内容呢?这里笔者分析了大量不同形态的生产日志,最后总结出4种形态 ...
- gist.github.com 无法访问解决办法,亲测永远有效!
1.打开https://www.ipaddress.com/,输入gist.github.com获取IP地址 2.ping 此ip地址,可以访问 3.将IP地址写入Hosts文件,140.82.113 ...
- 【Dos-BatchPrograming】01
--0. 1.文件后缀的延申 官方教程更推荐使用.cmd作为后缀 .cmd和.bat的区别: http://www.360doc.com/content/12/0810/09/3688062_2293 ...
- [VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
@ 目录 VS Code扩展机制 项目搭建 创建UI元素 活动栏按钮 主边栏视图 主边栏工具栏按钮 侧边栏右键菜单 编辑器右键菜单 项目地址 [VS Code扩展]写一个代码片段管理插件(一):介绍与 ...
- 编程语言mojo报错:error: cannot call function that may raise in a context that cannot raise
代码: from python import Python fn main(): # fn main() raises: # This is equivalent to Python's `impor ...
- NVIDIA公司的半成品项目cule——GPU端运行的Atari2600游戏环境——已经废弃的项目
官网介绍地址: https://developer.nvidia.com/blog/new-open-source-gpu-accelerated-atari-emulator-for-reinfor ...
- 利用Linux系统提供的和调度器相关的接口让进程或线程对某个处理器进行绑定
目录 设置进程与CPU的亲和性 设置线程与CPU的亲和性 设置进程与CPU的亲和性 taskset命令允许你查看或设置运行中的进程的CPU亲和性(即该进程可以在哪些CPU上运行). 要将一个已经运行的 ...
- Java和LWJGL的关于OpenAL的文章
一.OpenAL的原理和基本概念: 1.1 OpenAL的架构 OpenAL的架构同样基于三个核心组件:Context(上下文).Source(声源)和Buffer(缓冲区).Context代表了音频 ...
- Spring启动报8080端口被占用问题
1.window下关闭8080端口 win+R:输入cmd,回车 在黑窗口中输入指令:netstat -ano | findstr 8080 指令的意思是找出占用8080端口的进程pid ...
- Meissel_Lehmer模板
复杂度 \(O(n^\frac 23)\),计算 \(1\sim n\) 的素数个数 #define div(a, b) (1.0 * (a) / (b)) #define half(x) (((x) ...