矩阵加速学习笔记

1|0矩阵加速

矩阵加速主要是把 DP 的转移写成矩阵的形式,然后用矩阵快速幂优化。

可以用矩阵快速幂优化要求矩阵的运算是满足有结合律的,常用的 min,+ 卷积等。

还有一些特殊技巧,比如多组询问时可以预处理幂次的矩阵然后查询时直接用行向量来乘,以及存在矩阵光速幂。

1|1P4223 期望逆序对

题意:给一个排列,求随机交换 k 次后的期望逆序对数。

思路:把期望乘上总方案数后就是对逆序对数计数,于是我们考虑每一对(i,j)对最终答案的贡献。因为除了(i,j)之外的位置都是等价的,因此相关的状态只有7种,转移可以写成一个矩阵,直接矩阵快速就可以了。

|(n22)1n20n2001(n22)0n20n2010(n22)+(n3)101n3011(n22)+(n3)10n31001(n22)+(n3)1n301101(n22)+(n3)n3001111(n22)+2(n4)+1|

然后就是大分讨。

1|2P4007 小 Y 和恐怖的奴隶主

题意:有一个只有 m 点生命值的“恐怖的奴隶主”,这个“恐怖的奴隶主”有一个特殊的技能:每当它被扣减生命值但没有死亡(死亡即生命值 0),且 Boss 的随从数量小于上限 k,便会召唤一个新的具有 m 点生命值的“恐怖的奴隶主”。现在小 Y 可以进行 n 次攻击,每次攻击时,会从 Boss 以及 Boss 的所有随从中的等概率随机选择一个,并扣减 1 点生命值,她想知道进行 n 次攻击后扣减 Boss 的生命值点数的期望。

思路:设f[i][a][b][c]表示攻击i次后,有a,b,c个血量为1,2,3的随从的概率,那么有:

1.a0f[i+1][a1][b][c]f[i][a][b][c]×aa+b+c+1

2.b0

a+b+c<kf[i+1][a+1][b1][c+1]f[i][a][b][c]×ba+b+c+1

a+b+ckf[i+1][a+1][b1][c]f[i][a][b][c]×ba+b+c+1

3.c0

a+b+c<kf[i+1][a][b+1][c]f[i][a][b][c]×ca+b+c+1

a+b+ckf[i+1][a][b+1][c1]f[i][a][b][c]×ca+b+c+1

然后就可以快速幂了。但是这样是O(T1663logn)的,过不去,但是我们不需要求最后的整个矩阵,所以可以用一个行向量来乘,这样只需处理2i的矩阵,复杂度是O(1663logn+T1662logn)

1|3P6573 [BalticOI 2017] Toll

题意:有向图,给定 k,有些满足 ak+1=bk 的点之间有边,多次询问两点最短路。

思路:一开始以为是双向边,感觉不可做,结果是单向边。

首先可以把所有点分成n/k块,然后只有相邻的块间有连边,于是可以用矩阵来维护块间的转移,再外面套上倍增,这样就可以了。

1|4P4102 [HEOI2014] 林中路径

思路:没想到必须要维护 3 个矩阵。。。

维护 3 个矩阵,分别表示路径长度的 0,1,2 次方和。考虑倍增求 k 次幂,有:

A=A+A×GmB=B+B×Gm+mA×GmC=C+C×Gm+2mB×Gm+m2A×Gm

1|5P2012 拯救世界2

题意:有 12 种元素,其中有 4 种只能出现偶数次,4 种只能出现奇数次,求排列 n 个的方案数。

思路:究极矩阵快速幂优化。

首先是暴力的状压,用来压后 8 种的情况,然后分析出来其实值只与其中 1 的个数有关,于是状态就是 dp[i][0]dp[i][8],同时因为 dp[i] 只和 dp[i1] 有关,于是可以矩阵快速幂优化。

但是因为有多组询问,于是考虑矩阵光速幂,即每 65536 一组,这样最终只用 4 次。

因为我们要求的是转移矩阵乘上一个只有第一个元素是 1 的列向量,相当于就是矩阵中某一个固定的位置,于是可以就可以拆成 j=08(i=08(A4,iBi,j)k=08Cj,kDk,0),于是最后就从 93 一次运算变成了 92,然后就可以通过了。

1|6P2106 Sam数

题意:求有多少个 k 位的数满足相邻两位的数字间差不超过 2。

思路:矩阵快速幂优化 DP。

其实不难,就是设 f[i][j] 表示第 i 位为 j 的方案数,发现转移 f[i][j]=|jk|2f[i1][k] 可以用矩阵刻画,于是直接矩阵快速幂即可。

1|7P3702 [SDOI2017] 序列计数

题意:求有多少长为 n 的值域在 [1,m] 的序列,满足和是 p 的倍数且至少有一个质数。

思路:首先,我们只关心一个数在模 p 意义下的值,那么先不考虑质数的限制,可以求出 1m 中有多少模 pi 的数记作 cnti,然后可以 DP,记 f[i][j] 表示选了 i 个数在模 pj 的方案数,我们发现转移显然是可以用矩阵优化的。

现在的问题就是怎么处理质数的情况。可以简单容斥,用所有数的情况减去只用非质数的情况,这样就可以解决了。

复杂度 O(p3logn+m)

1|8P3193 [HNOI2008] GT考试

题意:求有多少个 n 位十进制数,满足给出的十进制字符串没有在这个数中出现过。

思路:设 f[i][j] 表示考虑前 i 位,已经匹配到了第 j 位的方案数,但是我们并不知道应该转移到哪里。这里就需要一个辅助数组 g[i][j] 表示如果当前匹配到了第 i 位,有添加数字的方法使得匹配到第 j 位,那么转移就是 f[i][j]=f[i1][k]×g[k][j]

我们发现这就是矩阵乘法的形式,于是直接矩阵快速幂优化就可以了。g 的求法可以直接 kmp。

复杂度 O(m3logn)


__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/18015110.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示