矩阵乘法
矩阵乘法定义
矩阵可以看成一个二维数组,\(A_{i,j}\) 表示第 \(i\) 行第 \(j\) 列的元素。
一般来说,定义广义上的加法 \(\oplus\) 和乘法 \(\otimes\),那么矩阵乘法定义如下:
设 \(A\) 是 \(P\times M\) 的矩阵,\(B\) 是 \(M\times Q\) 的矩阵,\(C=AB\) 是 \(P\times Q\) 的矩阵,那么有,
\[C_{i,j}=\bigoplus_{k=1}^{M}A_{i,k}\otimes B_{k,j}
\]
尝试证明矩阵乘法具有结合律,即
\[(AB)C=A(BC)
\]
也即对任意 \(i,j\),有,
\[((AB)C)_{i,j}=(A(BC))_{i,j}
\]
容易得到(方便起见,这里设矩阵均为 \(N\times N\) 的)
\[\begin{aligned}
((AB)C)_{i,j}
&=\bigoplus_{s=1}^{N}(AB)_{i,s}\otimes C_{s,j}\\
&=\bigoplus_{s=1}^{N}\left(\bigoplus_{t=1}^{N}A_{i,t}\otimes B_{t,s}\right)\otimes C_{s,j}
\end{aligned}
\]
\[\begin{aligned}
(A(BC))_{i,j}
&=\bigoplus_{t=1}^{N}A_{i,t}\otimes (BC)_{t,j}\\
&=\bigoplus_{t=1}^{N}A_{i,t}\otimes \left(\bigoplus_{s=1}^{N}B_{t,s}\otimes C_{s,j}\right)\\
\end{aligned}
\]
若 \(\otimes\) 对 \(\oplus\) 有分配律和结合律,则有
\[((AB)C)_{i,j}=(A(BC))_{i,j}=\bigoplus_{s=1}^{N}\bigoplus_{t=1}^{N}A_{i,s}\otimes B_{s,t}\otimes C_{t,j}
\]
对于一般的 \((+,\times)\) 矩阵乘法,后者对前者有分配律和结合律,因此一般定义的矩阵乘法具有结合律。
众所周知矩阵乘法可以优化 DP,例如斐波那契数列的递推;同时单点修改的 DP 可以用线段树维护,称之为 DDP(线段树维护的东西需要有结合律,不然没法设计 tag)。
对于更一般的 DP,可能需要广义的矩乘,例如 \((\max,+)\) 等。
矩阵乘法优化 DP
Eg.1 线性递推函数
最经典的问题是求斐波那契数列的第 \(n\) 项。
我们知道,
\[F_0=0,F_1=1,F_{n+1}=F_{n}+F_{n-1}\quad(n>0)
\]
不妨将递推时的关键信息放到向量里,类似:
\[\begin{bmatrix}F_{n-1} & F_{n} \cr\end{bmatrix}
\]
我们希望得到转移矩阵 \(T\),使得,
\[\begin{bmatrix}F_{n-1} & F_{n} \end{bmatrix}\times T=\begin{bmatrix}F_{n} & F_{n+1} \end{bmatrix}
\]
观察得:
\[T=\begin{bmatrix}
0 & 1 \\
1 & 1 \end{bmatrix}
\]
由于矩阵乘法具有结合律,
\[\begin{bmatrix}F_{n} & F_{n+1} \cr\end{bmatrix}=\begin{bmatrix}F_{0} & F_{1} \cr\end{bmatrix}\times T^n
\]
类似地,其他递推函数也可以这样处理,若矩阵是 \(k\times k\) 的,则复杂度为 \(O(k^3\log n)\)。
Eg.2 其他递推数列
考虑
\[f_{n+1}=3f_{n}+4f_{n-1}+2^{n}+5
\]
这种递推关系不是线性递推,因此不能只用 \(f_{n}\) 和 \(f_{n-1}\) 组成的向量。
考虑记录向量:
\[\begin{bmatrix}f_n & f_{n-1} & 2^n & 1\end{bmatrix}
\]
我们希望推到:
\[\begin{bmatrix}f_{n+1} & f_{n} & 2^{n+1} & 1\end{bmatrix}
\]
容易得到转移矩阵为
\[\begin{bmatrix}
3 & 1 & 0 & 0 \\
4 & 0 & 0 & 0 \\
1 & 0 & 2 & 0 \\
5 & 0 & 0 & 1 \\
\end{bmatrix}
\]
Eg.3 矩阵维护动态 DP
动态 DP,也即带修改的 DP。
// TODO