跳转至

矩阵乘法优化 DP

前置知识:矩阵乘法

矩阵快速幂优化常系数齐次线性递推

形如 $$ dp_x=\sum_{i=1}^{d}{dp_{x-i}t_i} $$ 的递推式叫做常系数齐次线性递推。其中 \(d\le n\)\(t_i\) 只和 \(i\) 相关而和 \(x\) 无关。

朴素递推的时间复杂度为 \(O(nd)\).

利用矩阵快速幂可以在 \(O(d^3\log n)\) 的时间复杂度处理常系数齐次线性递推。

我们发现 \(dp_x\) 的值只与 \(dp_{x-d}\)\(dp_{x-1}\) 的值有关。因此我们将这些 \(dp\) 值列成一个矩阵,记作 \(A_{i-1}\)

\[ \left[ \begin{matrix} dp_{i-d}& dp_{i-d+1}&\cdots& dp_{i-1} \end{matrix} \right] \]

我们发现,对于任意的 \(i\),将 \(A_{i-1}\) 乘上另一个矩阵 \(Op\),就能得到 \(dp_i\)\(A_i\). 对于普通的常系数齐次线性递推,\(Op\) 矩阵如下:

\[ \left[ \begin{matrix} 0&0&0&\cdots&0&0&t_d\\\ 1&0&0&\cdots&0&0&t_{d-1}\\\ 0&1&0&\cdots&0&0&t_{d-2}\\\ 0&0&1&\cdots&0&0&t_{d-3}\\\ &\vdots&&\ddots&&\vdots&\\\ 0&0&0&\cdots&1&0&t_2\\\ 0&0&0&\cdots&0&1&t_1 \end{matrix} \right] \]

该矩阵是一个 \(d\) 阶矩阵。我们发现它的前 \(d-1\) 列能把 \(A_{i-1}\) 中的所有元素向左偏移一个位置,而第 \(d\) 列则把 \(A_{i-1}\) 中的所有项加起来,放在 \(A_i\) 最后一列的位置。由此,我们有:

\[ A_i=A_{i-1}\times Op \]

从而

\[ A_x=A_0\times Op^x \]

由于矩阵乘法满足结合律,因此可以使用矩阵快速幂先求出 \(Op^n\),再用 \(A_0\) 与之相乘,从而得出 \(dp_n\)。时间复杂度 \(O(d^3\log(n))\). 该算法在 \(n\) 很大的时候能减小时间复杂度。