食用方法:按照提示完成下列习题
初识矩阵
你需要知道:矩阵的基础运算和基本性质(如矩阵的加法与乘法、矩阵满足结合律不满足交换律等)
1.基础
【模板】矩阵快速幂
学矩阵优化一定要会打矩阵快速幂!
2.矩阵加速递推数列
【模板】斐波那契数列
最经典数列优化,看透本质!
[ f n , f n − 1 ] × [ 1 1 1 0 ] = [ f n + 1 , f n ] [f_n,f_{n-1}]\times \left[\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right]=[f_{n+1},f_n] [fn,fn−1]×[1110]=[fn+1,fn]
[ f n , f n − 1 ] = [ f 0 , f 1 ] × [ 1 1 1 0 ] n − 1 [f_n,f_{n-1}]= [f_0,f_1]\times \left[\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right]^{n-1} [fn,fn−1]=[f0,f1]×[1110]n−1
一定要明白如何构造矩阵!
【模板】矩阵加速(数列)
其他数列也一样优化!
拓展:
A. 需要多一些信息才能构造的矩阵,如:
a 0 = 1 a_0 = 1 a0=1, a 1 = 1 a_1 = 1 a1=1
a n = ( a n − 1 + a n − 2 + n 2 ) a_n = (a_{n-1}+a_{n-2}+n^2) an=(an−1+an−2+n2) m o d mod mod p p p
提示:构造递推 n 2 n^2 n2 时还需要维护 n n n 和 1 1 1
更多应用:求斐波那契数列前 n n n 项和(矩阵中多出一个位置留给求和)
B. 维度更大的矩阵优化(见下面例题)
3.矩阵优化动态规划
矩阵优化的本质在于:
-
动态规划本质也是一个递推的过程
-
可以想象成棋盘上有若干棋子,每一轮每个棋子都会转移到棋盘上不同的位置上,转移的方式满足一定规律,一共要进行很多轮。由于棋子只能在棋盘上转移,所以转移相对固定。这种时候,我们就可以使用矩阵优化加速转移,只要进行 l o g n logn logn 轮就能知道答案。
概率dp:别踩地雷
一条路上有 N N N 个地雷。小 D 站在起点 1 1 1 的位置,每次有概率 p p p 走 1 1 1 步,有概率 ( 1 − p ) (1−p) (1−p) 走
2 2 2 步。给出 N , p N,p N,p 与 N N N 个雷的坐标 X i X_i Xi,请你求出小 D 踩不到地雷的概率是多少。 N ≤ 5 × 1 0 4 , 0.2 ≤ p ≤ 0.8 , 1 ≤ X i ≤ 1 0 18 N \leq 5\times10^4, 0.2 \leq p \leq 0.8, 1 \leq X_i \leq 10^{18} N≤5×104,0.2≤p≤0.8,1≤Xi≤1018。
把路面分成 N N N 段。容斥计算 ( 1 − 恰好踩到地雷的概率 ) (1-恰好踩到地雷的概率) (1−恰好踩到地雷的概率), d p i = p × d p i − 1 + ( i − p ) × d p i − 2 dp_i=p\times dp_{i-1}+(i-p)\times dp_{i-2} dpi=p×dpi−1+(i−p)×dpi−2,然后构造矩阵优化。
二维dp优化:统计方案数
依次选取 n n n 个 0 ∼ 3 0∼3 0∼3 之间的整数,求它们的和是 3 3 3 的倍数的方案数对 1 0 9 + 7 10^9+7 109+7 取模后的结果。 n ≤ 1 0 18 n\leq 10^{18} n≤1018。
设 f i , j f_{i,j} fi,j 表示选了 i i i 个数,这些数的和对 3 3 3 取模为 j j j 的方案数,答案即为 f i , 0 f_{i, 0} fi,0。
初值: f 0 , 0 = 1 f_{0,0}=1 f0,0=1,转移如下:
{
f
i
,
0
=
2
×
f
i
−
1
,
0
+
f
i
−
1
,
1
+
f
i
−
1
,
2
f
i
,
1
=
f
i
−
1
,
0
+
2
×
f
i
−
1
,
1
+
f
i
−
1
,
2
f
i
,
2
=
f
i
−
1
,
0
+
f
i
−
1
,
1
+
2
×
f
i
−
1
,
2
\left\{ \begin{aligned}f_{i,0}=2\times f_{i-1,0}+f_{i-1,1}+f_{i-1,2} \\ f_{i,1}=f_{i-1,0}+2\times f_{i-1,1}+f_{i-1,2} \\ f_{i,2}= f_{i-1,0}+f_{i-1,1}+2\times f_{i-1,2}\end{aligned} \right.
⎩
⎨
⎧fi,0=2×fi−1,0+fi−1,1+fi−1,2fi,1=fi−1,0+2×fi−1,1+fi−1,2fi,2=fi−1,0+fi−1,1+2×fi−1,2
然后进行矩阵优化。
难度提升!
思路点拨:与《统计方案数》类似,写出二维转移方程即可。
习题2:[TJOI2017] 可乐
思路点拨:动态规划,先写出每个点能由哪些点到达,“停在原地”可以理解为自己走到自己,“自爆”可以理解为走到一个没有出边的" 0 0 0 号点"进行转移,也可以理解为转移结束,然后求出前 t t t 秒内所有的方案和。这两种方法最终构造的矩阵是差不多的。
至此,你已经掌握了矩阵的基本用法了!恭喜!
我们将在下一节课继续探讨矩阵乘法的更多更高级的优化,敬请期待吧~