「REMAKE系列」概率期望dp篇
常见模型技巧总结
概率正推,期望倒推
简单概率期望
- 简单分类讨论。P1297 [国家集训队]单选错位
- 根据题目推导。UVA11021 Tribles
- Floyd预处理后dp。P1850 [NOIP2016 提高组] 换教室
- 辅助转移的变量也需要做期望操作。P1365 WJMZBMR打osu! / Easy
需要一些小观察、推式子的题目
- 01最终位置确定,倒推期望。CF1754E. Wish I Knew How to Sort
- 推下式子然后发现可以前缀和优化。CF1042E. Vasya and Magic Matrix
树图上概率期望
- 简单拓扑排序+期望。P6154 游走
- 简单树形 DP + 概率dp,可以换根也可以不换,还有点分治做法qwq。P2634 [国家集训队]聪聪可可
习题
洛谷
P6154 游走
题意
B 城可以看作一个有 \(n\;(n\leq 10^5)\) 个点 \(m\) 条边的有向无环图。可能存在重边。
zbw 在 B 城随机游走,他会在所有路径中随机选择一条路径,选择所有路径的概率相等。路径的起点和终点可以相同。
定义一条路径的长度为经过的边数,你需要求出 zbw 走的路径长度的期望,答案对 \(998244353\) 取模。
思路
- 注意题目要求的东西,路径长度的期望等于 总长度 / 路径数。
- \(f_i\) i 结尾的路径长度总和, \(g_i\) i 结尾的路径条数。
- \(g_i = \sum{edge(j,i)} g_j\) \(f_i = \sum_{edge(j,i)} f_j + g_j\) 。
- 边界 \(g_i = 1\) ,答案等于 \(\frac{\sum_i f_i}{\sum_i g_i}\) ,快速幂做逆元。
P1297 [国家集训队]单选错位
题意
\(n\leq 10^7\) 个选择题,每个选择题有 \(a_i\) 个答案,每道题的答案是上一道题的正确答案,询问期望做对的题目数量。
思路
- 分类讨论:
- \(a[i]=a[i-1]\) ,和随机选答案做对期望一样,\(\frac{1}{a_i} \times 1 = \frac{1}{a_i}\)
- \(a[i] > a[i - 1]\) ,有 \(\frac{a_{i-1}}{a_i}\) 的概率答案在前一个范围内的数,在 i - 1 项有 \(\frac{1}{a_{i-1}}\) 的概率选到正确答案,答案为 \(\frac{1}{a_i}\) 。
- \(a[i] < a[i - 1]\) ,同理答案为 \(\frac{1}{a_{i-1}}\) 。
UVA11021 Tribles
题意
一开始有 \(k\) 种生物,这种生物只能活1天,死的时候有 \(p_i\) 的概率产生 \(i\)只这种生物(也只能活一天),询问 \(m\) 天内所有生物都死的概率(包括 \(m\) 天前死亡的情况)。
思路
- \(dp[i]\) 表示对于某一只生物第 i 天消亡的概率,最后的答案算下 k 次幂就可以了。
- 考虑接下来生 j 只生物,其消亡概率为 \(dp[i] = \sum_{j<n} p[j]\times dp[j]^k\) ,复杂度 \(O(nm)\) 。
P2634 [国家集训队]聪聪可可
[提高+/省选-]、树形dp + 概率dp
题意
从树上随机选两点,路径和为 3 的倍数的概率?
思路
- 可以对路径模 3 等价处理,设计状态 \(dp[u][0/1/2]\) 表示 u 子树中距离 u 点距离模 3 意义下为 0,1,2 的方案数。
- 转移很简单,可以考虑换根dp来统计父亲的个数,也可以直接累加所有点的答案。
P1850 [NOIP2016 提高组] 换教室
[提高+/省选-]、floyd预处理、概率期望dp
题意略
思路
- 点数很少直接 floyd 找最短路径,然后直接线性dp。
- \(f_{i,j,0/1}\) 表示在第 i 节课,申请换了 j 次,第 i 节课有没有申请换的最小期望。
- 转移:
- \(f_{i,j,0}=\min (f_{i-1,j,0} + g_{c_i,c_{i-1}}, f_{i-1,j,1} + (1-k_{i-1}) \times g_{c_i,c_{i-1}} + k_{i-1}\times g_{c_i,d_{i-1}})\)
- 对于 \(f_{i,j,1}\) 的转移也很类似,就是多几种情况罢了。
P1365 WJMZBMR打osu! / Easy
题意略
思路
- 容易设出状态 \(f_i\) 表示 i 结尾的期望分数,难点在转移。
- 如果是
o
或者x
很好转移,如果是?
的话,需要讨论,既然都是 1/2 的概率,那就直接把转移代价各乘 1 / 2,注意维护的连续长度 len 也要 /= 2;
Codeforces
CF768D. Jon and Orbs
CF768D 、概率DP、
给 \(k\) 种龙晶,\(q\) 个询问,每天产生一种龙晶,且概率相等,每次询问一个 \(p\),求产生 \(k\) 种龙晶的概率 \(\geq \frac{p-ε}{2000}\) 的最小天数。
- 简单概率DP,设状态为 \(dp[i][j]\) 第 i 天产生 j 种龙晶
- 很容易转移。其中边界是
dp[i][0] = (i == 0) ? 1 : 0;
- 由于不知道最小天数,并且 p 和最小天数有单调性,所以直接滚动数组,预处理询问答案。
const int N = 1010;
int ans[N];
double dp[N];
int main() {
int k, q;
re(k), re(q);
dp[0] = 1;
for (int i = 1, p = 1; p <= 1000; i++) {
for (int j = k; j; j--)
dp[j] = dp[j] * j / k + dp[j - 1] * (k - (j - 1)) / k;
while (p <= 1000 && dp[k] * 2000 >= p - 1e-7) ans[p++] = i;
dp[0] = 0;
}
while (q--) {
int x;
re(x);
printf("%d\n", ans[x]);
}
return 0;
}
CF1754E. Wish I Knew How to Sort
题意
长为 \(n\) 的 01 数组,每次随机选取一对位置交换,如果 1 在前就交换两个元素,询问选取次数的期望使数组排好序?
思路
- 一个观察,0 和 1 的位置在排好序以后是固定的,只需要有多少个位置应该是 1 但现在是 0。
- 统计之后,以 \(f_i\) 表示有 i 对位置还需要交换。
- 期望倒推转移: \(f_i = \frac{i\times i}{n\times (n-1)} \times f_{i-1} + (1 - \frac{i\times i}{n\times (n-1)}) * f_i + 1\)
- 即 \(f_i = f_{i-1} + \frac{n\times (n-1)}{i*i}\)
CF1042E. Vasya and Magic Matrix
题意
一个\(n\)行\(m\)列的矩阵,每个位置有权值\(a_{i,j}\)
给定一个出发点,每次可以等概率的移动到一个权值小于当前点权值的点,同时得分加上两个点之间欧几里得距离的平方(欧几里得距离:\(\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\))),问得分的期望。
思路
- \(f_{i,j}\) 表示坐标 i,j 的到终点的期望得分。
- 将格子按权值排序后变成了一维的问题,写一下转移式子。
-
\[f_{i,j}= \sum_{x,y|a_{x,y}<a_{i,j}} \frac{(x-i)^2 + (y-i)^2 + f_{x,y}}{sum} \]
-
- 展开。\(f_{i,j} = \sum_{x,y}\frac{x^2 + y^2 + i^2 + j^2 - 2*i*x - 2*i*y + f_{x,y}}{sum}\)
- 这个式子是可以用前缀和优化转移的。同时维护几个前缀和就好了。