矩阵乘法加速递推

学习本算法最好有一定的数学基础

引入

先来看一下这样一道题:


给定递推式

f[i]=f[i2]+f[i1]+i+1 f [ i ] = f [ i − 2 ] + f [ i − 1 ] + i + 1

f[1]=f[2]=1 f [ 1 ] = f [ 2 ] = 1 f[n](n<=1e9) f [ n ] ( n <= 1 e 9 )


看到数据范围,可能会感觉无从下手,推算 f f 也发现并不能找到规律,这个时候我们怎么办呢?
这就衍生除了一个强大的算法——矩阵乘法

先看概念


概念

A A n×m n × m 的矩阵,当且仅当 B B m×n m × n 的矩阵时,它们可以进行矩阵乘法,它们的积是一个 n×n n × n 的矩阵 C C

解题

那这有什么用呢?我们重新看回上面那道题

f[i]=f[i2]+f[i1]+i+1 f [ i ] = f [ i − 2 ] + f [ i − 1 ] + i + 1

观察发现,其实当我们要往下一步进行推算时,每个项都有相应的变化,即
第一项 f[i2] f [ i − 2 ] -> f[i1] f [ i − 1 ]
第二项 f[i1] f [ i − 1 ] -> f[i] f [ i ] -> f[i2]+f[i1]+n+1 f [ i − 2 ] + f [ i − 1 ] + n + 1
第三项 i i -> i+1 i + 1
第四项 1 1 不变


也就是说,它们之间是具有互相递推的关系的,我们就可以用矩阵乘法对应每个项的系数即可

最后因为矩阵乘法满足结合律,所以我们可以先算出中间矩阵的 n n 次方,求解即可


详细解法见:https://blog.csdn.net/xuxiayang/article/details/82021171

你可能感兴趣的:(矩阵乘法,库,算法讲解)