矩阵快速幂
解决的问题
固定关系的一维k阶递推表达式
固定关系的k维一阶递推表达式
时间复杂度
矩阵乘法
前提:对于二维矩阵,两个行列式相乘需要满足一个行列式的列数=另一个行列式的行数
算法:
1 | vector<vector<int>> martix_mul(vector<vector<int>> a,vector<vector<int>> b ){ |
矩阵快速幂
前提:需要是正方形矩阵
单位矩阵:类似乘法中的1,即主对角线上为1,其余位置为0的矩阵,与矩阵相乘不会改变原矩阵
Code:
1 | vector<vector<int>> mqpow(vector<vector<int>> m, int p){ |
例:求斐波那契数列
使用矩阵可以加速斐波那契数列的递推,我们设向量
初始时令
这个转移可以表示为
为了求解左乘的转置矩阵,需要再写一项
这两个矩阵转化为方程组联立可以解得矩阵为
即每次递推只需要将当前状态向量相乘该转移矩阵即可实现
因此如果要求解转移n次后的结果,就可以表示为
这样我们可以将线性递推转化为求解矩阵快速幂,时间复杂度降为
1 |
|
使用矩阵乘法来加速递推
动态规划问题中,若递推的数据规模过大,显然线性递推会超时,此时我们需要考虑使用矩阵乘法加速递推
原理和上面的斐波那契数列推导类似
使用矩阵乘法时,重点是推导转移的形式
即推导出
例1: 矩阵加速
https://www.luogu.com.cn/problem/P1939
1 |
|