话说这是博主的第一篇博客。。。
咳咳咳,今天讲的是DP的一种优化策略——矩阵乘法
关于能用矩阵乘法优化的DP题目,有如下几个要求:
- 转移式只有加法,清零,减法etc.,max和min运算不允许
- 转移式中关于前几位dp结果得到的系数必须是常量
- 转移次数一般超级多
- 由于转移次数多,一般都要模一个int范围内的数
综上,举一个例子:
d p [ i ] = a × d p [ i − 1 ] + b × d p [ i − 2 ] + c × d p [ i − 3 ] dp[ i ]=a×dp[ i-1 ]+b×dp[ i-2]+c×dp[ i-3 ] dp[i]=a×dp[i−1]+b×dp[i−2]+c×dp[i−3]
其中,a,b,c是常量,而在需要矩阵优化的DP中,往往 i 在2^128之类的,特别鬼畜的特别大的数;
因为矩阵乘法优化后求dp[ i ] 是在O log(i)的时间内完成的。
那么,关于矩阵乘法如何实现,它的原理又是啥呢?
矩阵乘法需要两个矩阵A与B,A是n×p,B是p×m的大小,如下图
为了方便解释,我们举斐波那契的例子。
斐波那契的转移式是:dp[ i ]=dp[ i-1 ]+dp[ i-2 ]。
那么我们把(dp[ i ],dp[ i-1 ])看做一个1×2的矩阵A
而每次转移相当于把A乘以矩阵F:
|1 1|
|1 0|
得出的结果是: ( d p [ i ] + d p [ i − 1 ] , d p [ i ] ) (dp[ i ]+dp[ i-1],dp[ i ]) (dp[i]+dp[i−1],dp[i]),也就是 ( d p [ i + 1 ] ,