矩阵加速
矩阵加速
矩阵快速幂优化dp
先介绍矩阵乘法:
现有大小为 \(n * n\) 的矩阵A,B,C。
\[C=A \times B
\]
\[C_{i,j}=\sum_{k=1}^{n} A_{i,k} \times B_{k,j}
\]
可以简记为 : A横乘B竖
矩阵快速幂:
$ A * A * A * A * B = A^k * B $
和普通快速幂求解方式一样
模板
矩阵快速幂优化dp
把dp方程看成向量(或是1 * n的矩阵),尝试把转移方程当成矩阵。
例如:匪不垃圾式:\(f_n = f_{n-1} + f_{n-2}\)
\[(^{1, 1}_{1,0}) (^{f_{n-1}}_{f_{n-2}}) = (^{f_{n}}_{f_{n-1}})
\]
数据结构矩阵加速dp
我们可以把一个dp的转移看成乘上一个矩阵。
用矩阵快速幂是建立在每一个转移矩阵是一样的,但dp方程的转移往往与输入有关。于是就有了这玩意。
dp的一般形式:
\(dp_{初值} * A * B * C …… * Z = dp_{答案}\)(大写字母表示矩阵)
于是我们可以用数据结构来优化。(具体来讲,在ds的每个节点下存一个矩阵,修改操作就是把原来的矩阵删了加上新的矩阵)
总结一下:该算法用于处理对转移方程有微小修改操作的dp
如果这些转移矩阵不会变,那这个做法就是脱裤子放屁。