矩阵乘法

类型

  • 普通矩阵乘法

  • 广义矩阵乘法

ci,j=mink=1d(ai,k+bk,j)ci,j=k=1dmax(ai,k,bk,j)\begin{aligned} c_{i,j}&=\min_{k=1}^d(a_{i,k}+b_{k,j})\\ c_{i,j}&=\sum_{k=1}^d\max(a_{i,k},b_{k,j}) \end{aligned}

运算法则

只有结合律

无交换律

但是有一些有交换律,但是一定得证明。

矩阵快速幂

O(T3logn)O(T^3\log n)

一般思路

  • 找线性递推式

  • 构造矩阵

  • 快速幂

例题

P4159 [SCOI2009] 迷路

权值不是为 11,分层最短路,矩阵解决。

动态 dp

针对矩阵乘的是不一样的,并且多次询问 dpdp 值,线段树保存一段矩阵的连乘,快速求解。

fi=vi+j=1liwi,j×fijf_i=v_i+\sum_{j=1}^{l_i} w_{i,j} \times f_{i-j}

构造矩阵求解。

例题

P4513 小白逛公园

fif_i 表示以 ii 结尾的最大子段和。

gig_i 表示前 ii 个最大子段和。
fi=max(fi1+ai,a+i)f_i=\max(f_{i-1}+a_i,a+i)

gi=max(fi,gi1)g_i=max(f_i,g_{i-1})

广义矩阵乘法。

ci,j=mink=1d(ai,k+bk,j)c_{i,j}=\min_{k=1}^d(a_{i,k}+b_{k,j})

[gifi0]=[gi1fi10]×[0aiaiaiai0]\begin{bmatrix} g_i& f_i &0 \end{bmatrix}= \begin{bmatrix} g_{i-1}&f_{i-1}&0 \end{bmatrix}\times \begin{bmatrix} 0& -\infty &-\infty\\ a_i&a_i&-\infty\\ a_i&a_i&0\\ \end{bmatrix}\dotsb

线段树维护。

P4719 【模板】“动态 DP”&动态树分治

带修求树的最大权独立集。

考虑树上的操作变为序列上的操作,维护重儿子,轻儿子信息。

本质是为了减小矩阵大小。

第一遍求出答案,将矩阵算上。

从叶子节点,左乘矩阵求结果。

轻儿子

gi,0=jsoni,jwsmax(fj,0,fj,1)g_{i,0}=\sum_{j\in son_i,j\not ={ws}} \max(f_{j,0},f_{j,1})

gi,1=(jsoni,jwsfj,0)+vig_{i,1}=(\sum_{j\in son_i,j\not ={ws}}f_{j,0})+v_i

答案

fi,0=max(gi,0+fws,0,gi,0+fws,1)f_{i,0}=\max(g_{i,0}+f_{ws,0},g_{i,0}+f_{ws,1})

fi,1=gi,1+fws,0f_{i,1}=g_{i,1}+f_{ws,0}

叶子节点初始化 fi,0=gi,0=gi,1=0f_{i,0}=g_{i,0}=g_{i,1}=0fi,1=vi,f_{i,1}=v_i,

[fi,0fi,1]=[gi,0gi,0gi,1]×[fws,0fws,1]\begin{bmatrix} f_{i,0}\\ f_{i,1} \end{bmatrix}= \begin{bmatrix} g_{i,0}&g_{i,0}\\ g_{i,1} &-\infty \end{bmatrix}\times \begin{bmatrix} f_{ws,0}\\ f_{ws,1} \end{bmatrix}

叶子最后一项为 00,这样构造和欧拉序同样,方便写代码,每次都是左乘右,因此线段树正常写就好了,每次只改一条链,最后求 11 所在链就行。

基本思路

树形动态规划,树剖矩阵优化高效解决问题。

应用及特征

  • 找出线性递推式超时

  • 单点多次修改或区间多次询问 dpdp

  • 有一定局限性(背包就不行),本质与矩阵大小有关

例题

CF750E New Year and Old Subsequence

大力 dpdp 线段树维护矩阵。

参考文献

DP 优化方法大杂烩 I.

__END__