「学习笔记」期望概率dp
一.数学期望的概念#
「学习笔记」期望问题 是学习期望概率dp的基础,建议学习后再来阅读该学习笔记。
数学期望(简称期望),是试验中每次可能结果的概率乘以其结果的总和,它反映了随机变量平均取值的大小。
数学期望可以用加权平均数来理解,可能取值就是初始数据,概率就是每个数的权,此时期望就是加权平均数。
二.数学期望的计算公式#
对于随机变量 ,它有 种可能的取值,取值为 的概率为 ,那么它的数学期望 。
举个例子:给定一个随机变量 ,它有六种可能的取值,分别是 ,且取每个值得概率是一样的,那么 。
三.数学期望的性质#
设 为常数, 为随机变量,那么有:
- ;
- ;
- 重点:,线性性;
- 互相独立时, ;
- 结合上列性质,得出 互相独立时 。
四.期望dp#
求解达到某一目标的期望代价:因为最终的代价我们不知道,所以需要倒序求解。
设 为在 这个状态实现目标的期望代价(相当于相距目标多少)。
当然我们也可以采用正序求解,只需要将状态的意义确定,符合要求,就可以求解。
五.例题讲解#
Ybtoj【例题1】路径长度#
P4316 绿豆蛙的归宿#
因为已知最终状态,按照期望dp的想法,我们采用逆推。
设有向边 ,那么有 。
因为反向建边,所以我们要把 颠倒过来。
在 上进行拓扑排序即可转移状态。
核心代码:
queue <int> q;
q.push (n);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i=head[u]; i; i = e[i].from) {
int v = e[i].to;
f[v] += (f[u] + e[i].w) / dg[v];
if(--in[v] == 0) {
q.push (v);
}
}
}
Ybtoj【例题2】乘坐电梯#
CF518D Ilya and Escalator#
设 为在第 个人,第 秒时电梯上的期望人数。
那么,易得 。
最后输出 即可。
Ybtoj【例题3】期望收益#
P1365 WJMZBMR打osu! / Easy#
先思考一下,在连续 个 后面再加一个 ,会对答案产生多少贡献?
显然,会多贡献 。
当处理到第 位时,我们可以知道以第 位为结尾的连续 的期望长度,根据 连续 的期望长度,就可以轻松算出期望分数。
核心代码:
for (int i = 1; i <= n; i++) {
if (c[i] == 'o') {
ans += len * 2 + 1;//一定是,累计贡献。
len++;//同上。
}
else if (c[i] == 'x') {
len = 0;//一定不是,期望长度归0。
}
else {
ans += (len * 2 + 1) / 2;//有一半的概率不是o,所以要除以2。
len = (len + 1) / 2;//同上。
}
}
Ybtoj【例题4】期望分数#
P1654 OSU!#
和上题相似,但是指数为 。
也思考一下,在连续 个 后面再加一个 ,会对答案产生多少贡献?
计算出会多贡献 。
设 为在第 位得的分数期望,我们思考一下 和 的关系。
假设在 位置连续 串长度为 的概率为 ,在 位置是 的概率为 ,那么对于每一个单独的 它都有 的概率对分数产生 的额外贡献。
我们把所有可能的 一起考虑,就可以得到这个式子:
。
然后我们将式子转化为:
接下来维护 和 。
于是我们可以这么算:
。
然后我们递推,用三个变量存储即可。
核心代码:
for (int i = 1; i <= n; i ++) {
ans += (3 * len2 + 3 * len1 + 1) * p[i];
len2 = (len2 + 2 * len1 + 1) * p[i];
len1 = (len1 + 1) * p[i];
}
printf ("%.1lf", ans);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异