前言
做过的, 但是记忆中非简单, 于是冲一下
- 概率与期望
- \(\rm{dp}\) 特殊的点
- 一定一定一定要分阶段
- 可以先讨论那些更特殊的元素, 作为前阶段, 也就是说, 你可以在不影响概率的前提下处理阶段的优先级
- 结束状态一定倒推, 开始状态一定正推
- 期望 \(\rm{dp}\)
- 全期望公式直接转移
- 用期望定义
- 可以求出每种情况的方案数,然后用期望定义得到答案
- 先概率 \(\rm{dp}\)
- 期望的线性性拆开考虑
- 整体等概率一般可以拆成每一次均匀选择
- 概率 \(\rm{dp}\)
- 全概率公式直接转移
- \(\rm{dp}\) 特殊的点
上午做题下午补, 下课休息 + 复习 / 每日 \(\rm{C, D}\) , 晚上剩啥干啥
差不多, 下课是最需要做到的, 别颓
跟策略, 数据检验, 心态注意冷静, 放下, 耐心, 不浮躁
推 \(\rm{klr}\) 是活动身体, 听音乐是放松身心, 做题是保持状态, 赢!
思路
题意
两种元素
最初集合中有 个 , 个
轮流取出一个
特别的, 每次 取出一个时候, 随机选择集合中的一个元素深处
其中第一个取到 的胜利, 如果两个人都没有取到 胜利
问 胜利的概率
概率 \(\rm{dp}\) 总而言之没有期望那么多种方法, 往往就是按照全概率公式去做
也就是
\[P(A) = \sum_{i = 1}^{n} P(B_i) P(A|B_i)
\]
所以我们考虑递推, 往往正着推
观察性质发现公主胜利的概率可以用每个阶段的胜率乘以到达这个阶段的概率之和来表示
这个性质还是很简单了, 怎么用于做题
不难发现我们可以通过 \(\rm{dp}\) 求出每个阶段的概率及胜率, 然后不难统计
设状态 \(f_{w, b}\) 表示到达状态 \(\{w, b\}\) 的概率, 转移通过乘以 \(\rm{Bob}\) 的败率和 \(\rm{Alice}\) 的败率, 枚举删除元素即可
具体一点, 我们详细阐述一下式子
最初 \(f_{w, b} = 1\)
转移如下
\[\begin{align*}
f_{i, j} \gets
\begin{cases}f_{i, j + 3} \times P_1 \\f_{i + 1, j + 2} \times P_2
\end{cases}
\end{align*}\]
实现
边转移边统计即可
代码
#include <bits/stdc++.h>
const int MAXW = 1024;/*现在什么也别管就当考试, 下课就是复习或者 C/D , 推 klr 锻炼身体*/int w, b;
long double f[MAXW][MAXW], ans = 0.0;int main() {scanf("%d %d", &w, &b);for (int i = w ; i >= 0; i--) for (int j = b; j >= 0; j--) {if (i == 0 && j == 0) continue;if (i == w && j == b) f[i][j] = 1.0;else {f[i][j] += f[i + 1][j + 2] * (j + 2) * 1.0 / (i + j + 3) * (j + 1) / (i + j + 2) * (i + 1) / (i + j + 1);f[i][j] += f[i][j + 3] * (j + 3) * 1.0 / (i + j + 3) * (j + 2) / (i + j + 2) * (j + 1) / (i + j + 1);}ans += f[i][j] * i * 1.0 / (i + j);}printf("%.10Lf", ans);return 0;
}