概率期望

她说还好没能够失去幻想

伟大的勇者逃避也要擅长

完成例行的失望

继续前往果壳里寻找宝藏

她说还不能就此放弃幻想

太阳没降落眼中就有光芒

看透生活的真相

依然前往果壳里寻找宝藏

——洛天依《救活一只知更鸟》


概率期望

并非,应该改名为 dp 专题。

经常的 trick 是倒序 dp。即把正的过程倒过来,令 \(f\) 为某个状态到最终状态 这一段的期望 或 最终状态的期望,这样 dp 有时候会更方便。

天依宝宝可爱!


方差

  • 定义随机变量 \(X\) 的方差 \(D(X) = E((X - E(X))^2)\),因为期望就是平均值,所以这个式子的含义就是 \(X\) 的每个值与 \(X\) 的平均值的差的平方的平均值,和初中所学的方差有一点相似之处。

  • 方差的平方根称为标准差,记作 \(\sigma(X) = \sqrt {D(X)}\)

  • 方差反应了随机变量的离散程度,方差越大,随机变量的取值越分散。

  • 由期望的线性性,可以得到方差的一个更好用的表达式:

    \[D(X) = E(X^2) - E(X)^2 \]

    推导过程:

    \[\begin{aligned} D(X) & = E((X - E(X))^2) \\ & = E(X^2 + E(X)^2 - 2XE(X)) \\ & = E(X^2) + E(X)^2 - 2E(X)^2 \\ & = E(X^2) - E(X)^2 \end{aligned} \]

    其中,第三步的理由是:因为第二步中的 \(E(X)\) 实际上就相当于一个常数了,因为 \(X\) 是固定的,它的期望也是固定的。所以就直接当常数乘出去即可。

  • 一个小性质:\(D(aX) = a^2 D(X)\),其中 \(a\) 为常数。

天依宝宝可爱!


CF148D

思维难度:\(\color{#F39C11} 橙\) *900

概率 dp 板子。令 \(f_{i,j}\) 表示 \(i\) 个白球 \(j\) 个黑球 A 获胜的概率,考虑当前轮拿球的情况,显然有转移:

\[\begin{aligned} f_{i,j} = & \frac i {i+j} \\ & + \frac i {i+j} \times \frac {j-1} {i+j-1} \times \frac i {i+j-2} \times f_{i-1,j-2} \\ & + \frac i {i+j} \times \frac {j-1} {i+j-1} \times \frac {j-2} {i+j-2} \times f_{i,j-3} \end{aligned} \]

submission

天依宝宝可爱!


POJ 3071

思维难度:\(\color{#F39C11} 橙\) *900

还是板子,直接暴力 dp 即可,令 \(f_{i,j}\) 为队伍 \(i\)\(j\) 轮后存活的概率,枚举每个可能与 \(i\) 在第 \(j\) 轮相遇的队伍,二进制搞一下,暴力转移,复杂度是 \(O(2^{2n}n)\) 的。

sb poj 一会儿 CE 一会儿 T 一会儿 WA 的,反正思路是对的,代码也挺对的,不调了。猜测是多测多输入了或者少输入了的问题。

upd on 25.08.20. 现在过了,原来语言要选 C++ 啊……

submission

天依宝宝可爱!


CF768D

思维难度:\(\color{#F39C11} 橙\) *1100

注意到概率期望完全不是同一个东西,不要弄混了。概率是不去考虑每个变量取了多少的,只考虑一个变量发生的概率。

显然 dp 状态就是令 \(f_{i,j}\) 表示 \(i\) 天取了 \(j\) 个物品的概率。转移直接考虑取的是否是新物品即可,有式子:

\[f_{i,j} = \frac {k-(j-1)} k f_{i-1,j-1} + \frac j k f_{i-1,j} \]

注意到 \(p \le 1000\),所以 \(\frac p {2000} \le \frac 1 2\),所以要求的概率很小,对应的天数实际上也很小,所以直接暴力 dp 是可以的。发现 \(k=1000\) 在天数 \(10000\) 的时候概率已经到达了 \(>0.9\),故值域取 \(10000\) 即可。

submission

天依宝宝可爱!


POJ 2096

思维难度:\(\color{#FFC116} 黄\) *1300

首先题面很 shi,简要题意:

在一个 \(n \times m\) 的矩阵中,每次操作等概率撒点(包括已经撒过点的位置),求每行每列都撒过点的期望操作次数。

显然有一个显然的 dp,就是令 \(f_{i,j}\) 为填满 \(i \times j\) 的矩阵的操作次数,转移考虑最后一次撒点撒到了什么位置,有:

\[f_{i,j} = \frac {(n-i+1) \times (m-j+1)} {n \times m} f_{i-1,j-1} + \frac {(n-i+1) \times j} {n \times m} f_{i-1,j} + \frac {i \times (m-j+1)} {n \times m} f_{i,j-1} + \frac {i \times j} {n \times m} f_{i,j} + 1 \]

移项即可。

但是注意到,在 \(i=n , j=m\) 的时候,\(i \times j = n \times m\),于是左右两边的 \(f_{i,j}\) 就约掉了,就没法转移了。

那么如何处理呢,只能考虑换状态了。我们的目的是不让 \(f_{i,j}\) 的系数的分子可能成为 \(n \times m\),但发现好像怎么设计都无法避免,那就索性不避免了,直接把它当做初始状态来做!

所以,就可以得到一个新的状态,令 \(f_{i,j}\) 表示填满 \(i \times j\) 的矩阵距离填满 \(n \times m\) 剩余的操作次数,显然次数初始状态为 \(f_{n,m} = 0\),也不难写出转移式:

\[f_{i,j} = \frac {(n-i) \times (m-j)} {n \times m} f_{i+1,j+1} + \frac {(n-i) \times j} {n \times m} f_{i+1,j} + \frac {i \times (m-j)} {n \times m} f_{i,j+1} + \frac {i \times j} {n \times m} f_{i,j} + 1 \]

虽然 \(i \times j\) 还是可能等于 \(n \times m\),但是这种情况被放在了初始状态中,所以就相当于避免了它的出现!

submission

天依宝宝可爱!


洛谷 P1850

思维难度:\(\color{#FFC116} 黄\) *1400

怎么以前做过但是现在一点也不会了/jk

dp 是显然的,令 \(f_{i,j,0/1}\) 为前 \(i\) 节课申请换了 \(j\) 次,第 \(i\) 次是否申请的期望代价。

但是发现这样就没法确定第 \(i\) 次是否成功了,但是这是很重要的。

在这里卡住了。

考虑换状态?不行,这样就没法确定上个位置到底申请没申请,也就不能转移。

做法是直接枚举上一次和这一次是否换成功,概率分别为 \(p_{i-1}\)\(p_i\)

这样为什么是对的呢?不会重复乘一个概率吗?

回到状态定义,注意到状态只关心是否申请,不关心是否成功,所以就包含了成功和不成功两种情况,且两者的概率是已知的。而且在从 \(i-1\)\(i\) 转移的时候,决定新的代价的是 \((i-1,i)\) 的取值,与 \(i-1\) 之前的取值没有任何关联,所以代价就不会重复计算。

或者说,这是一个最小代价的期望而不是操作次数的期望,所以这一步之前的代价与这一步的代价是没有转移的概率关系的,毕竟求最小值是要枚举前面的每个状态来转移不是把前面的状态乘上概率再加起来

submission

天依宝宝可爱!


CF908D

思维难度:\(\color{#52C41A} 绿\) *1700

trick:

在状态 \(S\) 下,若一次操作以 \(p\) 的概率转移到状态 \(T\),以 \(1-p\) 的概率停留在状态 \(S\),那么从 \(S\) 转移到 \(T\) 的期望步数为 \(\frac 1 p\)

这个 trick 可以有效地避免算一些无穷级数相关的东西(状态可以达到无穷大)。虽然这个题貌似没用到。

dp 还是很显然的,令 \(f_{i,j}\) 为当前有 \(i\)\(\tt a\)\(j\)\(\tt ab\),到停止时的期望 \(\tt ab\) 个数,考虑在后面增加 \(\tt a\) 还是 \(\tt b\),有:

\[f_{i,j} = \frac {p_a} {p_a + p_b} f_{i+1,j} + \frac {p_b} {p_a + p_b} f_{i,j+i} \]

但是这样可以发现 dp 是没有边界的,\(i\) 可以趋近于无穷大。

不过稍微推一下式子,令 \(a = \frac {p_a} {p_a + p_b} , b = \frac {p_b} {p_a + p_b}\)。注意到当 \(i+j \ge k\) 时,显然 \(f_{i,j+i} = j+i\)。于是有:

\[\begin{aligned} f_{i,j} & = a f_{i+1,j} + b f_{i,j+i} \\ & = a f_{i+1,j} + b(j+i) \\ & = a (a f_{i+2,j} + b f_{i,j+i+1}) + b(j+i) \\ & = a (a f_{i+2,j} + b(j+i+1)) + b(j+i) \\ & = a^2 f_{i+2,j} + ab (j+i+1) + b(j+i) \\ & = a^3 f_{i+3,j} + a^2b (j+i+2) + ab (j+i+1) + b(j+i) \\ & = \cdots \\ & = \sum _{x=0} ^{+\infin} a^xb (i+j+x) \end{aligned} \]

为了方便,令 \(t = i+j\),把 \(b\) 拿出来,有:

\[f_{i,j} = b \sum _{x=0} ^{+\infin} a^x (t+x) \]

于是就需要求 \(\displaystyle \sum _{i=0} ^{+\infin} a^i (t+i)\) 这个无穷级数,其中 \(0 < a < 1 , t \ge 0\)

注意到是等差乘等比的形式,所以考虑错位相减,令:

\[s_n = \sum _{i=0} ^n a^i (t+i) \tag 1 \]

于是:

\[a s_n = \sum _{i=0} ^n a^{i+1} (t+i) \tag 2 \]

然后 \((1) - (2)\),则:

\[\begin{aligned} (1-a) s_n & = \sum _{i=0} ^n a^i (t+i) - \sum _{i=0} ^n a^{i+1} (t+i) \\ & = t + a(t+1) + a^2(t+2) + \cdots + a^n(t+n) - at - a^2(t+1) - a^3(t+2) - \cdots - a^{n+1}(t+n) \\ & = \sum _{i=0} ^n a^it + \sum _{i=0} ^n ia^i - \sum _{i=1} ^{n+1} a^it - \sum _{i=0} ^n ia^{i+1} \\ & = t - a^{n+1} t + \sum _{i=0} ^n i (a^i - a^{i+1}) \\ & = t - a^{n+1} t + (1-a) \sum _{i=0} ^n ia^i \end{aligned} \]

于是只需要求 \(\displaystyle \sum _{i=0} ^n ia^i\) 即可,显然也是个等差乘等比,还是错位相减,令 \(s'_n\) 等于这个东西,有:

\[s'_n = \sum _{i=0} ^n ia^i \tag 3 \]

\[as'_n = \sum _{i=0} ^n ia^{i+1} \tag 4 \]

\((3) - (4)\) 得:

\[\begin{aligned} (1-a) s'_n & = \sum _{i=0} ^n ia^i - \sum _{i=0} ^n ia^{i+1} \\ & = a + 2a^2 + 3a^3 + \cdots + na^n - a^2 - 2a^3 - \cdots -na^{n+1} \\ & = a + a^2 + a^3 + \cdots + a^n - na^{n+1} \\ & = \sum _{i=1} ^n a^i - na^{n+1} \end{aligned} \]

发现等比数列,对其求和,有:

\[\begin{aligned} (1-a) s'_n & = \sum _{i=1} ^n a^i - na^{n+1} \\ & = \frac {a (1-a^n)} {1-a} - na^{n+1} \end{aligned} \]

然后其实就不要把 \(1-a\) 除过去了,因为上面就是要求 \(\displaystyle (1-a) \sum _{i=0} ^n ia^i\),所以:

\[(1-a) s_n = t - a^{n+1} t + \frac {a(1 - a^n)} {1 - a} - n a^{n+1} \]

\(1-a\) 除过去,得:

\[\begin{aligned} s_n & = \frac t {1-a} - \frac {a^{n+1}t} {1-a} + \frac {a(1-a^n)} {(1-a)^2} - \frac{n a^{n+1}}{1-a} \\ & = \frac t {1-a} + \frac{a - a^{n+1}}{(1-a)^2} - \frac {(n+t) a^{n+1}} {1-a} \end{aligned} \]

至此就得到了 \(s_n\) 的通项,带入原式,得:

\[\begin{aligned} f_{i,j} & = \sum _{x=0} ^{+\infin} a^xb (t+x) \\ & = b \times \left( \frac t {1-a} + \frac {a - a^{\infin+1}} {(1-a)^2} - \frac {(\infin+t) a^{\infin+1}} {1-a} \right) \end{aligned} \]

注意到 \(0 < a < 1\),所以 \(\displaystyle \lim _{n \to \infin} a^n = 0\),于是与 \(a^{\infin+1}\) 有关的都可以看做 \(0\) 了。

然后,注意到最后一项中出现了一个 \(\infin \times a^{\infin}\) 的东西,这个趋近于多少呢?丢到 desmos 上即可。可以发现 \(\infin\) 的增长速度远小于 \(a^{\infin}\) 的下降速度,所以这个也是趋近于 \(0\) 的。

有:

\[\begin{aligned} f_{i,j} & = b \times \left( \frac t {1-a} + \frac a {(1-a)^2} \right) \\ & = \frac {bt} {1-a} + \frac {ab} {(1-a)^2} \end{aligned} \]

因为 \(b = 1-a\),所以进一步化简:

\[\begin{aligned} f_{i,j} & = t + \frac a b \\ & = i + j + \frac {\frac {p_a} {p_a + p_b}} {\frac {p_b} {p_a + p_b}} \\ & = i + j + \frac {p_a} {p_b} \end{aligned} \]

草草草终于推完了。

还有一点,就是在求 \(f_{0,0}\) 的时候,可以发现 \(f_{0,0} = a f_{1,0} + b f_{0,0}\),移项推一下得到 \(f_{0,0} = f_{1,0}\),所以直接求 \(f_{1,0}\) 即可。

附等差乘等比求和公式:

\(A_n = p^n(a+nb)\)\(S_n = \sum _{i=0} ^n A_i\),其中 \(p,a,b\) 为常数,则有:

\[S_n = \frac a {1-p} + b \times \frac {p - p^{n+1}} {(1-p)^2} - \frac {(a + n \times b) \times p^{n+1}} {1-p} \]

submission

天依宝宝可爱!


洛谷 P2473

思维难度:\(\color{#FFC116} 黄\) *1300

首先有一个显然的 dp,令 \(f_{i,s}\) 为前 \(i\) 轮吃了集合 \(s\) 的期望得分,考虑下一轮吃什么,\(c_i\) 表示物品 \(i\) 的依赖集合,有:

\[f_{i,s} + [c_j \subset s] \times p_j \xrightarrow{\frac 1 n} f_{i,s \cup \{j\}} \]

看上去好像没问题,但是可以注意到 \(f_{i,s}\) 并不一定是一个存在的状态,所以转移的概率并不一定是 \(\frac 1 n\),而可能是一坨乱七八糟的东西。

所以就需要倒过来做,令 \(f_{i,s}\) 为剩余 \(i\) 轮,当前已经吃了集合 \(s\),从当前轮到最后一轮这一段的期望得分,有:

\[f_{i,s} = \frac 1 n \sum _{j=1} ^n \max (f_{i+1,s} , [c_j \subset s] \times ( f_{i+1 , s \cup \{j\}} + p_j)) \]

submission

天依宝宝可爱!


洛谷 P3232 | 消元技巧

思维难度:\(\color{#F39C11} 橙\) *900

注意到 \(n \le 500\),所以直接 dp 每个点的期望经过次数然后高消,边的期望经过次数也就知道了,贪心排边权即可。

需要特判 \(n\) 的一些特殊情况,因为 \(n\) 不能往外走。

submission

天依宝宝可爱!


HDU 3853

思维难度:\(\color{#FE4C61} 红\) *800

?这种题该出现在这里吗

题面有点描述不清吧,没指出在一个格子被困住(只能转移到本身)的情况该怎么处理……

哦原来语言要选 C++ 啊。

submission

天依宝宝可爱!


CF24D

思维难度:\(\color{#F39C11} 橙\) *1000

越来越简单是怎么回事。

dp 是显然的,发现有环所以高消。注意到每行是独立的,可以分开消,注意到系数矩阵式条带状的,所以消元是 \(O(m)\) 的。

不过还有一个更人类智慧的做法

当有一个 dp 式子按照概率分布转移,即 \(f_{x} = \sum _i p_i \times (f_{x_i} + c_i)\) 的时候,如果满足以下两点,直接迭代 \(\log \epsilon ^{-1}\) 次(即把 dp 过程进行这些次),就可以得到相对误差低于 \(\epsilon\) 的答案!

  • \(c_i \ge 0\)\(c_i\) 有界(不能趋近于 \(\infin\))。
  • \(0 \le p_i \le 1\) 且不能对某个状态依赖越来越强直到趋近于 \(1\)(例如 \(f_1 = f_2 , f_2 = f_1\))。

省流:dp 有环(有后效性)?迭代 \(\log \epsilon ^{-1}\) 次,相信收敛速度

当然你取模 \(998244353\) 就寄了()

submission

天依宝宝可爱!


TopCoder 12984 | 主元法

思维难度:\(\color{#FFC116} 黄\) *1200

还能这么搞。

显然直接高消是 \(O((nm)^3)\) 的,会寄。

需要用到主元法。

所谓主元法,就是在 dp 有后效性的时候,假设其中一部分 dp 值已知(令已知的状态为集合 \(S\)),并使得 \(S\) 已知后 dp 不存在后效性。然后 dp 推出其它所有状态的值,用 \(\sum _{x \in S} a_ix + b\) 表示出来。

这样,可以发现 \(S\) 中状态的 dp 方程还没有使用,那么用 \(S\) 之外的状态 dp 出这些状态,就可以得到 \(|S|\) 个方程,这样高消的复杂度就降到了 \(O(|S|^3)\),不过这里一般没有什么特殊矩阵可以降复杂度了。

注意一点,dp 的初始值是需要直接令为初始值的,而不是用 \(S\) 表示。不然你 dp 个毛线啊()

这题就可以令 \(f_{0,j}\)\(f_{i,0}\) 为主元,这样复杂度就降到了 \(O(n+m)^3\)

洛谷支持 C++23 了/jy

假装自己是 submission

天依宝宝可爱!


洛谷 P6395

思维难度:\(\color{#FFC116} 黄\) *1400

天依题!/qq

两眼治疗之雨。为什么不是一眼呢,因为需要转化一下题意()

注意可以把两个操作反过来。因为题意要求,判定是在吃完一个店铺之后立即进行的,并不包括这个时刻和下一个时刻之间的撤场事件。所以这样定义方便一点。

submission

天依宝宝可爱!


洛谷 P9156

思维难度:\(\color{#FFC116} 黄\) *1500

打 CCBC 咕了好几天,最后 27-2,作为全队除了队长以外都是第一次做 PH 题的队,还是不错的。另外奶猫可爱!大福可爱!

dp 是显然的,令 \(f_{i,j}\) 表示剩余 \(i\) 对牌,已知其中 \(j\) 张(已知的两两不同)的先手最大期望得分,随便分讨一下推个转移式子就可以了。

当然还有更方便一点的方法,就是把最大期望得分换成最大期望比对方高的分数,这样会好处理一些,不过也差别不大。这个是在零和博弈(双方得分之和固定)中常用的 trick。

喜报:复活了。

submission

天依宝宝可爱!

posted @ 2025-08-05 17:50  little__bug  阅读(17)  评论(0)    收藏  举报