关于期望 DP 的一点点东西
因为这个吃亏太多了所以来写一下。
0. 前言
解有环的线性方程组最好不要惯性思维直接上高斯消元。
-
转移无环直接递推/递归解决,这个一般没有什么问题;
-
只是个别点会构成回路,那么定义辅助的数组;
-
高斯消元解决,用来破环,值得一提的是可以对强连通分量缩点之后内部高斯消元,对于某些性质题(或者骗分)还是有用的。
(以上每一点的前半句来自第一次学期望时的课件)
所以这里重点要提第二点及相关的 trick。
1. 少数点成环
主要思想:提取环上的关键点表示其它点,然后反解。
I. ZOJ3329 One Person Game
定义 \(dp_i\) 表示计数器为 \(i\) 时达成目标的期望次数。那么有 \(\forall i\geq n, dp_i=0\),要求 \(dp_0\)。
枚举掷出的点数为 \(A,B,C\),那么有:\(dp_i=\dfrac{1}{K_1K_2K_3}\left(\sum_{A,B,C}dp_{i+A+B+C}[A\not=a\vee B\not=b\vee C\not=c]+dp_0\right)+1\)。
注意到右边一定有一个 \(dp_0\),也就是这个转移是成环的。但是我们可以用 \((k_i,b_i)\) 表示 \(dp_i=k_i dp_0+b_i\),直接按照转移求出 \(k,b\) 即可,有 \(dp_0=\dfrac{b_0}{1-k_0}\)。
II. 「HDU4035」Maze
定义 \(dp_u\) 表示在 \(u\) 走出迷宫的期望步数。有转移:\(dp_i=dp_1k_u+(1-k_u-e_u)\sum_v\dfrac{dp_v+1}{d_u}\),其中 \(d_u\) 表示 \(u\) 的度数,\(v\) 与 \(u\) 相邻。
比照上面一题,右边有父亲、根和子节点。不妨用 \((A_i,B_i,C_i)\) 表示 \(dp_i=A_idp_1+B_idp_{fa_i}+C_i\),后面的处理过程是类似的。
2. DAG 上 DP
注意这里主要指直接 dfs 遍历图是做不了的(不然就直接做了),比如原图是有环的,可能需要上面的 trick 的。
主要思想:用少量的变元表示所有变元,然后利用已知变元写出变元更少的方程。
I. 航行
定义 \(dp_{x,v}\) 表示在 \(x\) 位置,速度为 \(v\) 上岸的期望次数。\((x,v)\) 可以转移到 \((x+v+1,v+1)\) 和 \((x+v-1,v-1)\)。增广矩阵是稀疏的,但是似乎无法直接利用。
因为要求的都是 \(dp_{x,0}\),考虑用这些表示其他变元。这里需要一个大眼观察,这个表示的过程其实是不带环的,因为想要回到一个位置速度一定要经过变成 \(0\) 的过程,那在中途就可以用另一个变元表示它。
所以相当于在 DAG 上用 \(dp_{x,0}\) 表示所有变元,跑拓扑排序即可,中间记录 \(E_{x,v}\) 和 \(P_{x,v}\) 表示从某个 \(v = 0\) 的状态到达 \((x,v)\) 的期望次数与路径概率。
最后可以得到一个关于 \(dp_{x,0}\) 的线性方程组,就可以用高斯消元做了。
这里复杂度的保证是与矩阵的稀疏有关系的,矩阵中非零的个数 \(m\) 对应了 DAG 的边数。最后可以做到 \(O(n(nv+m)+n^3)\),其中 \(m=nv\),也即 \(O(n^2v+n^3)\)。
II. 指鹿为马
字符串匹配容易想到利用 KMP 自动机。定义 \(dp_i\) 表示在状态 \(i\) 的期望,有 \(dp_n=0\),要求 \(dp_0\)。
转移比较简单:\(dp_i=1+\sum_cdp_{\delta(i,c)}P_{s_i,c}+[\delta(i,c)=0]E_{s_i}\)。其中 \(s_i\) 表示第 \(i\) 个字符,\(P_{s_i,c}\) 表示 \(s_i\) 的下一个字符生成 \(c\) 的概率,\(E_{s_i}\) 表示从 \(s_i\) 开始生成到首字符(\(s_1\))的期望次数(鄙人赛时没有考虑这个 \(E\) 导致过不了最后一个样例)。
乍一看这个转移是有环的,但是如果把含 \(dp_{i+1}\) 的项全部放在一边,另一边除了常数一定是 \(\sum k\times dp_{j},j\leq i\) 的形式(根据 KMP 自动机的定义,\(\delta(i,c) \leq i+1\))。
按照移项后的式子得到的是一个三角矩阵,相当于已经高斯消元好了,转移是 DAG,所以用 \(k_idp_0+b_i\) 表示出所有变元,最后 \(dp_0=-\dfrac{b_i}{k_i}\),答案需要再加上初始字符的 \(1\)。

浙公网安备 33010602011771号