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\]
浙公网安备 33010602011771号