In solitute,where we a|

Luisvacson

园龄:3年6个月粉丝:5关注:0

矩阵乘法例题讲解

1.定长路径统计

给出一个n个点m条边的有向图,每次给出三个整数u,v,k,求有多少条从uv的路径长度为k(不一定为简单路径)

我们用邻接矩阵G存储这个图,Gu,v表示从uv的边数

Fk为长度为k的路径条数构成的矩阵,显然有:

Fki,j=k=1nFk1i,k×Gk,j

我们将其看作是两个矩阵相乘:

Fk=Fk1×G

那么显然有:

Fk=Gk

矩阵快速幂即可

2.定长路径统计*

给出一个n个点m条边的有向图,每次给出三个整数u,v,k,求有多少条从uv的路径长度小于等于k(不一定为简单路径)

我们把每个点加一条连向自己的边权为1的边,跑矩阵快速幂即可

3.「LibreOJ 6208」树上询问

给出一棵有n个节点的树,根节点为1号节点每个节点有两个值k,t,初始均为0
每次进行如下3种操作之一:
1.Add(x,d):将x到根节点路径上每个点的kiki+d
2.Mul(x,d):将x到根节点路径上每个点的titi+d×ki
3.Query(x):求tx
1n,m105,10d10

直接树剖确实可以做,但是比较麻烦,我们用矩阵来刻画每个操作:

Add

[tiki1][1000100d1]=[tiki+d1]

Mul

[tiki1][100d10001]=[ti+d×kiki1]

然后树剖维护即可

4.[TJOI2019]甲苯先生的字符串

给出一个仅有小写字母字符串S1,求满足如下条件的字符串S2有多少种:
1.S2长度为n
2.S2仅由小写字母构成
3.S1中长度为2的任意连续子串在S2中不能出现
1n1015

我们将小写字母映射为数字,即a=1,b=2z=26

dpi,j为长度为i且当前字符为j的合法字符串数量,显然有:

dpi,j=k=126dpi1,k[kjS1]

我们预处理出后面那个东西,令它为w,那么就有:

dpi,j=k=126dpi1,k×wk,j

n很大,暴力dp会炸掉,发现上面的转移方程是矩阵乘法的形式,可以用矩阵优化:

原矩阵:

[dpi,1dpi,2dpi,26]

base矩阵:

[w1,1w1,2w1,26w2,1w2,2w2,26w26,1w26,2w26,26]

5.[SHOI2013]超级跳马

现有一个 nm 列的棋盘,一只马欲从棋盘的左上角跳到右下角。每一步它向右跳奇数列,且跳到本行或相邻行。跳跃期间,马不能离开棋盘。例如,当 n=3,m=10 时,下图是一种可行的跳法。
image
求总方案数。
1n50,2m109

dpi,j为跳到(i,j)的方案数,显然当只往右跳1格时有:

dpi,j=dpi1,j1+dpi,j1+dpi+1,j1

考虑到如果能一次跳到(i,j),那么肯定也可以一次跳到(i,j2),所以转移方程即为:

dpi,j=dpi1,j1+dpi,j1+dpi+1,j1+dpi,j2

直接dp发现O(nm)的复杂度接受不了,考虑矩阵优化(以n=3为例):

原矩阵:

[dp1,jdp2,jdp3,jdp1,j1dp2,j1dp3,j1]

base矩阵:

[110100111010011001100000010000001000]

注意到n非常小,故以上做法可以通过

posted @   Luisvacson  阅读(779)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起