古典叙事 · 技术札记

序章

山河有卷
人间有声

写代码,也写长风、旧城与未熄的灯。
愿每一篇随笔,都有自己的山水与回声。
阅览随笔

概率dp

概率DP

概率dp有两个很核心的思想

概率 DP(求某个事件发生的概率):

正向推导逻辑:由已知的初始状态(概率为 1)出发,沿着时间轴顺推,将概率按转移分支分散,直到目标状态。方程形态:\(P(\text{当前}) = \sum P(\text{前驱}) \times \text{转移概率}\)

期望 DP(求到达终点需要的步数/代价):

逆向推导逻辑:由于“期望”定义为“未来还需要付出的代价”,所以必须从明确知道未来的状态(终点,未来代价为 0)开始,一步步倒推回初始状态。方程形态:\(E(\text{当前}) = \text{当前步的代价} + \sum \text{转移概率} \times E(\text{后继})\)

状态的定义

尝试从正面和逆向两种思想来定义状态:
dp[阶段][状态] = 进行到这一阶段时,恰好处于该状态的概率
这类是“正推”:已知初始分布,模拟概率如何流动。
dp[状态] = 从该状态开始,最终成功的概率
这类是逆推:一个状态的答案等于下一步所有可能状态答案的概率加权平均。

寻找边界

期望 DP 的锚点通常是目标状态 \(f_{\text{target}} = 0\)(到达目标不需要再走),或者极端状态(一定不会影响答案,且确定的)

列公式

无脑列方程(全期望公式):
不管有没有后效性(循环依赖),先把全期望公式列出来。
格式永远是:\(f_i = 1 + p_1 \cdot f_{\text{走法1}} + p_2 \cdot f_{\text{走法2}} + \dots\)

处理后效性(解方程):

如果发现 \(f_i\) 依赖了 \(f_{i-1}\),说明出现了环。

后效性的处理方式

当状态转移方程中出现 \(f_i\) 依赖 \(f_{i+1}\)\(f_{i-1}\)(比如一条链上的来回走动),直接 for 循环是推不出来的。

神技 1:单步期望差分(降维法)适用场景:

只能往左走一步或往右走一步的线性结构(例如 B 君按开关)。操作:令状态为“从 \(i\) 走到 \(i-1\) 的单步期望”,通过代数化简把 \(f_{i-1}\) 消掉,变成只依赖 \(f_{i+1}\) 的一阶递推。

神技 2:待定系数法(树上期望 DP)适用场景:

在树形结构上随机游走,既能走向父亲,也能走向儿子。操作:树上的状态转移最终都可以化简为 \(f_u = A_u \cdot f_{fa} + B_u\) 的形式。我们通过一遍 DFS 从叶子节点往上推算出所有的 \(A_u\)\(B_u\),再通过一遍 DFS 从根节点(\(f_{root} = 0\))往下算出所有的 \(f_u\)

神技 3:高斯消元(万能暴力解法)适用场景:

一般的图论随机游走,状态关系是一张复杂的网,毫无规律。操作:把有 \(N\) 个状态的转移方程看作 \(N\) 元一次方程组,直接套用 \(\mathcal{O}(N^3)\) 的高斯消元法求解。

四种常见模型

模型 1:收集邮票 / 抽卡模型 (Coupon Collector)特征:

每次等概率获取 \(N\) 种物品中的一种,求集齐所有物品的期望次数。状态:\(f_i\) 表示已经收集了 \(i\) 种,还想收集剩下 \(N-i\) 种的期望次数。转移:\(f_i = 1 + \frac{i}{N} f_i (\text{抽到已有的}) + \frac{N-i}{N} f_{i+1} (\text{抽到新的})\)化简:\(f_i = f_{i+1} + \frac{N}{N-i}\)模型

2:带有“死亡/重置”的闯关模型特征:

连续成功 \(N\) 次才算通关,一旦失败直接退回起点(或者损失一半进度)。套路:利用前缀期望思想。假设过第 \(i\) 关的成功率为 \(p_i\)。方程:\(E_i = E_{i-1} + 1 (\text{先花1步尝试}) + (1-p_i) \cdot (\text{失败后的惩罚步数})\)

模型 3:DAG(有向无环图)上的随机游走特征:

只能往前走,不能回头。解法:最简单的期望 DP。直接在反图上跑拓扑排序,或者采用记忆化搜索,从终点逆推到起点即可。

模型 4:状态压缩 + 期望 DP特征:

发现物品数量或者状态数极小(\(N \le 20\))。解法:结合二进制位运算,将所有的已知状态压缩为一个整数。方程通常是 \(f_{mask} = \sum P_i \cdot f_{mask \cup \{i\}} + \text{代价}\)

对于有后效性的dp可以采用下面方式

后效来源 / 状态 常规复杂度 常见优化
最近 k O(T·A^k·D) 自动机压缩、KMP / AC 自动机、矩阵快速幂
出现过哪些事件(bitmask) O(n·2^n) 或更高 SOS DP、子集卷积、Meet in the Middle、对称状态合并
累计和 / 还差多少 O(T·目标·D) 前缀和、滑动窗口、差分、FFT/NTT 卷积、取模压缩
各类别剩余数量 状态数为组合数 计数向量、去掉身份、排序规范化、生成函数
剩余次数很大 O(T·S·D) 矩阵快速幂、线性递推加速
时间模周期 O(T·m·S·D) 将周期并入状态,按完整周期做矩阵快速幂
上一步 / 当前模式 O(T·S·模式数) 合并等价模式、稀疏转移、低秩转移优化
对称状态 原状态数很大 规范化、轨道合并(对称类)
抽取不放回 状态维度较高 用剩余数量、超几何分布 / 组合数直接转移
有环状态 解方程通常 O(S^3) SCC 分块、稀疏矩阵、迭代法、利用结构化转移
posted @ 2026-08-04 20:49  Morphis‘  阅读(19)  评论(0)    收藏  举报