【DP】DP优化之矩阵快速幂

前置知识

矩阵快速幂

我们以斐波那契问题为一个例子引入。
首先,我们不妨考虑三个数: F ( n ) ,    F ( n − 1 ) ,    F ( n − 2 ) F(n),\>\>F(n-1),\>\>F(n-2) F(n),F(n1),F(n2)
注意到递推式 F ( n ) = F ( n − 1 ) + F ( n − 2 ) F(n)=F(n-1)+F(n-2) F(n)=F(n1)+F(n2) 其实是一个动态转移方程,考虑DP(废话
于是我们得到了一个 O ( n ) O(n) O(n) 的DP。
我们可以考虑优化空间,把数组滚动存储,变成 O ( 1 ) O(1) O(1) 的空间复杂度。
得到如下的伪代码:
b + c → a a → b b → c \begin{matrix}b+c\to a\\a\to b\\b\to c\end{matrix} b+caabbc
这不是都会吗我讲它干啥
我们将这玩意压缩成一个矩阵
[ F ( n ) F ( n − 1 ) ] \begin{bmatrix}F(n)\\F(n-1)\end{bmatrix} [F(n)F(n1)]
注意到
[ F ( n ) F ( n − 1 ) ] = [ F ( n − 1 ) + F ( n − 2 ) F ( n − 1 ) ] = [ 1 1 1 0 ] × [ F ( n − 1 ) F ( n − 2 ) ] = [ 1 1 1 0 ] n − 2 × [ F ( 2 ) F ( 1 ) ] \begin{bmatrix}F(n)\\F(n-1)\end{bmatrix}=\begin{bmatrix}F(n-1)+F(n-2)\\F(n-1)\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}\times\begin{bmatrix}F(n-1)\\F(n-2)\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-2}\times\begin{bmatrix}F(2)\\F(1)\end{bmatrix} [F(n)F(n1)]=[F(n1)+F(n2)F(n1)]=[1110]×[F(n1)F(n2)]=[1110]n2×[F(2)F(1)]
所以将幂的那一部分提出来,快速幂一下,没了。

总结一下:
对于当前一组DP状态可以由上一组线性组合得到时,不妨将多个DP状态放进一个矩阵里,然后由前一组DP状态乘上一个转移矩阵得到下一组状态,迭代回初始状态,快速幂一下。

算法性能

  • 时间复杂度: O ( m 3 log ⁡ n ) O(m^3\log n) O(m3logn)
  • 空间复杂度: O ( m 2 ) O(m^2) O(m2)

注: m m m 为一组状态的数量, n n n 为迭代的次数

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值