算法学习笔记:期望/概率 DP

前言

教练讲之前我是完全不会的啊,讲完了感觉大脑旋转。

主要写题单里的题的题解。

预备知识

离散型随机变量的期望

设离散型随机变量 \(X\) 的概率分布为 \(p_i=P(X=x_i)\),则 \(X\)期望 \(E(X)\) 定义为

\[\sum p_ix_i \]

连续型随机变量的期望

设离散型随机变量 \(X\) 的密度函数为 \(f(x)\),则 \(X\)期望 \(E(X)\) 定义为

\[\int xf(x)\text{d}x \]

题单练习

Luogu P5104 红包发红包

题意

有一个 \(w\) 元的红包,若红包剩下 \(w'\) 元,则这个人抢到的钱数是从 \([0,w']\) 等概率随机生成的实数 \(x\)。问第 \(k\) 个人期望抢到的钱数,答案对 \(10^9+7\) 取模。

对于所有数据,\(0<w<10^9+7\)\(1\leq k\leq 10^{18}\)

题解

设第一个人抢到的钱数为 \(x\),则 \(x\) 的分布函数 \(f(x)=[x\in[0,w]]\frac{1}{w}\)。那么所求的期望就是

\[E(x)=\int_0^w\frac{x}{w}\text{d}x=\frac{w}{2} \]

对于第二个人,期望剩下 \(\frac{w}{2}\) 元,那么期望抢到的钱数就是 \(\frac{w}{4}\)……以此类推,第 \(k\) 个人期望抢到的钱数就是 \(\frac{w}{2^k}\)。快速幂 \(O(\log{k})\) 求解即可。

Luogu P6154 游走

题意

给定一个 \(n\) 个点 \(m\) 条边的 DAG,问从所有路径中(路径可以为一个点),等概率随机选择其中一条的期望长度,答案对 \(998244353\) 取模。

对于所有数据,\(1\leq n\leq 10^5\)\(1\leq m\leq 7\times 10^5\)

题解

它都不是期望 DP 题。期望长度即路径长度总和除以路径总条数,DAG 上 DP 统计即可。时间复杂度 \(O(n+m)\)

Luogu P4316 绿豆蛙的归宿

题意

给定一个 \(n\) 个点 \(m\) 条边的带权 DAG,起点为 \(1\) 号点,终点为 \(n\) 号点,保证从起点出发能到达所有点,所有点也都能到达终点。现在绿豆蛙从起点走到终点,每次从所有能到达的点中等概率选择一个走,问走的路径的期望长度。

对于所有数据,\(1\leq n\leq 10^5\)\(1\leq m\leq 2n\)

题解

裸题。令 \(f_u\) 表示 \(u\rightarrow n\) 的期望路径长度,在反图上 DP 即可。时间复杂度 \(O(n+m)\)

Luogu P1850 [NOIP 2016 提高组] 换教室

题意

一个人需在 \(n\) 个时间段选课,每时间段有原教室 \(c_i\) 和可选教室 \(d_i\)。他可以最多申请 \(m\) 次更换教室,第 \(i\) 个时间段申请成功概率为 \(p_i\)。所有申请需一次性提交,每个时间段只能申请一次。所有教室构成一个 \(v\) 个点 \(e\) 条边的无向带权图,课间移动消耗的体力为两教室间的最短路径,求总体力消耗的期望最小值。

对于所有数据,\(1\leq n\leq 2\times 10^3\)\(0\leq m\leq 2\times 10^3\)\(1\leq v\leq 300\)\(0\leq e\leq 9\times 10^4\)

题解

经典题。先 Floyd 预处理多源最短路,然后容易想到令 \(f_{i,j,0/1}\) 表示考虑前 \(i\) 个时间段,共使用 \(j\) 次申请次数,第 \(i\) 个时间段是否申请换教室的期望最小值。分讨第 \(i-1\) 个和第 \(i\) 个时间段分别是否申请成功容易得到转移方程:

\[\begin{align*} & f_{i,j,1} = \min \begin{cases} f_{i-1,j-1,0} + dis(c_{i-1}, d_i) \times p_i + dis(c_{i-1}, c_i) \times (1 - p_i), \\ f_{i-1,j-1,1} + dis(d_{i-1}, d_i) \times p_{i-1} p_i + dis(d_{i-1}, c_i) \times p_{i-1} (1 - p_i) \\ \quad + dis(c_{i-1}, d_i) \times (1 - p_{i-1}) p_i + dis(c_{i-1}, c_i) \times (1 - p_{i-1}) (1 - p_i) \end{cases} \\ & f_{i,j,0} = \min \begin{cases} f_{i-1,j,0} + dis(c_{i-1}, c_i), \\ f_{i-1,j,1} + dis(d_{i-1}, c_i) \times p_{i-1} + dis(c_{i-1}, c_i) \times (1 - p_{i-1}) \end{cases} \end{align*} \]

时间复杂度 \(O(v^3+nm)\)

Luogu P3412 仓鼠找sugar II

题意

给定一棵 \(n\) 个点的树,小仓鼠想从任意的起点 \(s\) 走到任意的终点 \(t\),每次会从所有相邻的节点中等概率随机选择一个走,问走的路径长度的期望,答案对 \(998244353\) 取模。

对于所有数据,\(1\leq n\leq 10^5\)

题解

妙妙题。枚举终点 \(t\) 作为树的根节点,然后你发现它可以往回走,导致你如果设计 \(f_u=E(dis(u,t))\) 会有后效性,\(n\) 的范围显然不允许我们做高斯消元。

考虑一些高妙的东西,注意到某个点 \(u\rightarrow t\) 随机走出来的路径必然会包含 \(path(u,t)\) 上的边,所以我们有

\[E(dis(u,t))=\sum_{\substack{x\in path(u,t)\\x\neq t}}E(dis(x,fa_x)) \]

很自然地想到设计 \(f_u=E(dis(u,fa_u))(u\neq t)\),但这个好像还是列不出普通的转移方程啊!但是我们仔细考虑 \(u\) 如何能走到 \(fa_u\)。首先它有 \(\frac{1}{deg_u}\) 的概率可以直接走到 \(fa_u\),其次对于每个子节点 \(v\in son_u\),它还有 \(\frac{1}{deg_u}\) 的概率走到 \(v\),然后再沿 \(v\rightarrow u\rightarrow fa_u\) 走到 \(fa_u\)。于是我们可以列出一个神秘的方程:

\[f_u=\frac{1}{deg_u}+\frac{1}{deg_u}\sum_{v\in son_u}f_v+f_u+1 \]

解方程可以得到

\[f_u=deg_u+\sum_{v\in son_u}f_v \]

于是我们可以树形 DP 求出所有 \(f_u\) 了!然后对于一条边 \((u,fa_u)\),显然它是 \(sz_u\) 个节点向上走的必经边。我们令 \(f_t=0\),则 \(ans_t=\sum_{u=1}^t sz_uf_u\)

枚举 \(t\),把所有 \(ans_t\) 加起来再除以 \(n^2\) 就是答案,于是我们有了 \(O(n^2)\) 的做法。转移方程是个和式,某个点的贡献容易增删,显然可以换根 DP 优化到 \(O(n)\)。实现时注意一下换根前后根节点的贡献即可。

其实我们也有不那么高妙的角度。我们回到令 \(f_u=E(dis(u,t))\),转移方程就是 \(f_u=\frac{1}{deg_u}\sum_{(u,v)\in E}f_v+1\)。从叶子节点开始考虑,那么 \(f_u\) 的值只和 \(f_{fa_u}\) 有关,进一步扩展到某个叶子结点的父亲 \(u'\),它的每个儿子都可以表示成有关 \(f_{u'}\) 的一次函数,代入得到 \(f_{u'}\) 的值又只与 \(f_{fa_{u'}}\) 有关……这样向上递推,容易发现 \(f_u\) 最终就是一个关于 \(f_{fa_{u}}\) 的一次函数,可以记录系数树形 DP 求解。再去记录子树的 \(f_u\) 和容易拓展到换根 DP 的形式。时间复杂度还是 \(O(n)\) 的。显然两种角度本质相同。

Luogu P1654 OSU!

题意

有一个长度为 \(n\)\(0/1\) 串,第 \(i\) 个位置有 \(p_i\) 的概率为 \(1\)\(1-p_i\) 的概率为 \(0\)。定义这个串的价值为所有极长连续 \(1\) 段的长度的立方和。求这个串的期望价值。

对于所有数据,\(1\leq n\leq 10^5\)

题解

考虑从当前位置 \(i\) 向左扩展的极长连续 \(1\) 段,它的长度 \(x\) 增加 \(1\) 后带来的贡献为 \((x+1)^3-x^3=3x^2+3x+1\),因此想到维护从当前位置向左扩展的极长连续 \(1\) 段的长度的期望 \(f_i\) 和长度的平方的期望 \(g_i\)。容易得到转移方程:

\[\begin{align*} f_i&=\frac{1}{p_i}(f_{i-1}+1) \\ g_i&=\frac{1}{p_i}(g_{i-1}+2f_{i-1}+1) \end{align*} \]

对于答案的期望 \(ans_i\) 也有类似的转移:

\[ans_i=ans_{i-1}+\frac{1}{p}(3f_{i-1}+3g_{i-1}+1) \]

请注意这两种转移的微妙区别,\(f_i,g_i\) 维护的是从当前位置 \(i\) 向左扩展的极长连续 \(1\) 段的长度/长度平方的期望,而 \(ans_i\) 维护的是所有极长连续 \(1\) 段的长度的立方和期望。

时间复杂度为 \(O(n)\)

Luogu P3211 [HNOI2011] XOR和路径

题意

给定一个 \(n\) 个点 \(m\) 条边的带权无向连通图。你想从 \(1\) 号点走到 \(n\) 号点,每次会从所有相邻的节点中等概率随机选择一个走,问路径上边权异或和的期望值。

对于所有数据,\(2\leq n\leq 100\)\(1\leq m\leq 10^4\)

题解

\(n\) 的范围强烈引导我们做高斯消元。令 \(f_u\) 表示 \(u\rightarrow n\) 的路径上边权异或和的期望值。容易得到转移方程:

\[f_u=\frac{1}{deg_u}\sum_{(u,v,w)\in E}f_v\operatorname{xor}w \]

这种形式当然不能高斯消元。考虑拆位,那么转移方程变成:

\[f_u=\frac{1}{deg_u}\sum_{(u,v,w)\in E}[w=0]f_v+[w=1](1-f_v) \]

最后对应累加答案即可。时间复杂度为 \(O(n^3\log{V})\)。实现时注意判自环。

posted @ 2025-02-22 12:51  P2441M  阅读(48)  评论(0)    收藏  举报