DP优化 - 矩阵快速幂优化

以矩阵方式加速递推。

矩阵乘法

假设

\[A=\begin{bmatrix} A_{1,1}&A_{1,2}&\ldots&A_{1,k}\\ A_{2,1}&A_{2,2}&\ldots&A_{2,k}\\ \vdots&\vdots&\ddots&\vdots\\ A_{n,1}&A_{n,2}&\ldots&A_{n,k}\\ \end{bmatrix} ,B= \begin{bmatrix} B_{1,1}&B_{1,2}&\ldots&B_{1,m}\\ B_{2,1}&B_{2,2}&\ldots&B_{2,m}\\ \vdots&\vdots&\ddots&\vdots\\ B_{k,1}&B_{k,2}&\ldots&B_{k,m}\\ \end{bmatrix} ,C = \begin{bmatrix} C_{1,1}&C_{1,2}&\ldots&C_{1,m}\\ C_{2,1}&C_{2,2}&\ldots&C_{2,m}\\ \vdots&\vdots&\ddots&\vdots\\ C_{n,1}&C_{n,2}&\ldots&C_{n,m}\\ \end{bmatrix} \]

\[C=A \times B \]

则有:

\[C_{i,j} = \sum_{x=1}^{k} A_{i,x}\times B_{x,i} \]

比如说:

\[\begin{bmatrix} A_{1,1}&A_{1,2}&A_{1,3}\\ A_{2,1}&A_{2,2}&A_{2,3}\\ \end{bmatrix} \times \begin{bmatrix} B_{1,1}&B_{1,2}&B_{1,3}&B_{1,4}\\ B_{2,1}&B_{2,2}&B_{2,3}&B_{2,4}\\ B_{3,1}&B_{3,2}&B_{3,3}&B_{3,4}\\ \end{bmatrix}= \begin{bmatrix} C_{1,1}&C_{1,2}&C_{1,3}&C_{1,4}\\ C_{2,1}&C_{2,2}&C_{2,3}&C_{2,4}\\ \end{bmatrix}\\ \]

时间复杂度 \(O(nmk)\)

如果一个 \(n \times m\) 的矩阵可以开方,需要满足 \(n = m\)

假设

\[A = \begin{bmatrix} A_{1,1}&A_{1,2}&\ldots&A_{1,n}\\ A_{2,1}&A_{2,2}&\ldots&A_{2,n}\\ \vdots&\vdots&\ddots&\vdots\\ A_{n,1}&A_{n,2}&\ldots&A_{n,n}\\ \end{bmatrix}\]

若要计算 \(A^a\)

则时间复杂度为 \(O(n^3\log a)\)

算法复杂度

时间复杂度: \(O(n^3\log a)\)

空间复杂度:\(O(n^2)\)

算法实现

此处尝试优化斐波那契数列的 DP 算法。

斐波那契数列 DP 转移方程为:

\[f_i=\begin{cases} 1&(i\leq2)\\ f_{i-1}+f_{i-2}&(3 \leq i)\\ \end{cases}\]

我们使用一个 \(2 \times 1\) 的矩阵来表示状态。

\[\begin{bmatrix} f_i\\ f_{i-1}\\ \end{bmatrix} \]

然后我们需要求出一个矩阵 \(A\) 使得 \(A\) 满足

\[ A \times \begin{bmatrix} f_{i-1}\\ f_{i-2}\\ \end{bmatrix}= \begin{bmatrix} f_i\\ f_{i-1}\\ \end{bmatrix} \]

可以通过 \(C_{i,j} = \sum_{x=1}^{k} A_{x,i}\times B_{j,x}\) 逆推,容易求得

\[A=\begin{bmatrix} 1&1\\ 1&0\\ \end{bmatrix}\]

我们还需要一个初始矩阵 \(B\) 表示初始状态

斐波那契数列 DP 时

\[B=\begin{bmatrix} 1\\ 1\\ \end{bmatrix}\]

最终答案矩阵为

\[B \times A ^ x \]

\[\begin{bmatrix} 1\\ 1\\ \end{bmatrix} \times \begin{bmatrix} 1&1\\ 1&0\\ \end{bmatrix}^x\]

posted on 2023-02-14 18:18  Evan_song  阅读(13)  评论(0)    收藏  举报