期望 DP 随笔
我根本就不会期望 DP,连 recollecter 都不会,所以这些东西很简单的话,你可以不看,我是写给我自己看的。
考虑我们有如下问题:
现在在一个 DAG 的唯一入度为 \(0\) 的节点,每次等概率走一条边,问期望步数是多少。
首先根据直觉,肯定有 \(f(u)\) 为 \(u\) 开始的期望步数,转移很容易,\(f(u) = \sum_{v \in G(u)} \frac{1}{|G(u)|} (1 + f(v))\)。
这是符合直觉的,那正着来呢?
其实,假如正向转移,我们可以令 \(f(u)\) 代表从起点到 \(u\) 的期望步数,那么 \(f(u) = (f(v) + 1) \cdot P(u 从 v 转移而来)\)。注意这里 \(\sum P(u 从 v 转移而来) = 1\)。
要想计算 \(P(u 从 v 转移而来)\),我们需要额外维护一个 \(p(v)\) 代表从起点经过随机游走走到 \(v\) 的概率。
那么在点 \(v\),它下一步走到 \(u\) 的概率其实是 \(\frac{p(v)}{|G(v)|}\)。我们把所有通向 \(u\) 的点 \(v\) 的这个概率加起来,\(\frac{p(v_1)}{|G(v_1)|}\) 在和里占的比例便是 \(P(u 从 v_1 转移而来)\)。
这就是归一化,看着也很对是吧,思考其中的本质是什么。
考虑反向算法:我们走向的点其实是一个子结构,所以可以直接算平均,这是最符合直觉的做法。
考虑正向做法:在反向做法里,每条路径对应的概率其实随着每次平均被压缩,最后在起点平均时,每条路径对应的概率刚好是正确的。但是正向做法的转移,是依赖 \(p(v)\) 的,因为从 \(v\) 来看,走到 \(u\) 的概率是 \(\frac{1}{|G(v)|}\),而从 \(u\) 来看,其实是全局上的概率。正向的 \(p(v)\) 计算本质上就是在对反向算法被压缩的概率做一次正向还原。
一些技巧:当需要记录额外状态/出现环的时候,可以把期望拆成每一步来计算。如果出现环,还可以高斯消元计算。

浙公网安备 33010602011771号