矩阵乘法
类型
ci,jci,j=k=1mind(ai,k+bk,j)=k=1∑dmax(ai,k,bk,j)
运算法则
只有结合律。
无交换律
但是有一些有交换律,但是一定得证明。
矩阵快速幂
O(T3logn)
一般思路
例题
P4159 [SCOI2009] 迷路
权值不是为 1,分层最短路,矩阵解决。
动态 dp
针对矩阵乘的是不一样的,并且多次询问 dp 值,线段树保存一段矩阵的连乘,快速求解。
fi=vi+j=1∑liwi,j×fi−j
构造矩阵求解。
例题
P4513 小白逛公园
fi 表示以 i 结尾的最大子段和。
gi 表示前 i 个最大子段和。
fi=max(fi−1+ai,a+i)
gi=max(fi,gi−1)
广义矩阵乘法。
ci,j=k=1mind(ai,k+bk,j)
[gifi0]=[gi−1fi−10]×⎣⎢⎡0aiai−∞aiai−∞−∞0⎦⎥⎤⋯
线段树维护。
P4719 【模板】“动态 DP”&动态树分治
带修求树的最大权独立集。
考虑树上的操作变为序列上的操作,维护重儿子,轻儿子信息。
本质是为了减小矩阵大小。
第一遍求出答案,将矩阵算上。
从叶子节点,左乘矩阵求结果。
轻儿子
gi,0=j∈soni,j=ws∑max(fj,0,fj,1)
gi,1=(j∈soni,j=ws∑fj,0)+vi
答案
fi,0=max(gi,0+fws,0,gi,0+fws,1)
fi,1=gi,1+fws,0
叶子节点初始化 fi,0=gi,0=gi,1=0,fi,1=vi,
[fi,0fi,1]=[gi,0gi,1gi,0−∞]×[fws,0fws,1]
叶子最后一项为 0,这样构造和欧拉序同样,方便写代码,每次都是左乘右,因此线段树正常写就好了,每次只改一条链,最后求 1 所在链就行。
基本思路
树形动态规划,树剖矩阵优化高效解决问题。
应用及特征
-
找出线性递推式超时
-
单点多次修改或区间多次询问 dp 值
-
有一定局限性(背包就不行),本质与矩阵大小有关
例题
CF750E New Year and Old Subsequence
大力 dp 线段树维护矩阵。
参考文献
DP 优化方法大杂烩 I.
__END__