矩阵优化dp
都快csps了,还什么都不会的菜鱼(我估计着马上就可以改了这句话了,成了都快noip了)
矩阵
我们要用矩阵优化dp,首先要知道矩阵是个什么东西(感觉其实可以不用知道)。
矩阵的很多定义啥的都可以选择去oi-wiki上去进行学习。很简单的一堆定义。读者自学不难,这里就不多赘述。
矩阵加法
就是将对应
矩阵乘法
这里大概讲一下矩阵乘法的原理:(突然学了,这里说的好像是内积,外积没见过用(逃)
我们会由一个
一个重要的性质:矩阵乘法是符合结合律的,这也是为什么我们可以用快速幂去优化dp
矩阵求逆
我们有时候会用到一个矩阵的逆矩阵,这个时候我们就要去思考如何计算出来这个逆矩阵。
我们通常是在我们的矩阵右边拼上一个单位矩阵,然后用高斯消元的方法,将左边的原矩阵,变成一个单位矩阵,此时我们右边得到的就是我们的原矩阵的逆矩阵。
矩阵除法
我们将我们要除以的矩阵转换为它的逆矩阵(类比逆元),这个时候再对他进行矩阵乘法。
矩阵求最大最小(这个名字是我自己取的)(貌似已经名算有主,叫做广义矩阵乘法)
感觉矩阵里面可能并没有这个操作,但是我们在优化dp的时候难免不会少了这种求最大最小的动规形式,所以就单独拎出来说一下,也就当作矩阵的一个基本运算吧(辉算?还是carp算)找到题目了再upd(逃
广义矩阵乘法的
广义矩阵乘法是具有结合律的,所以也可以用矩阵快速幂来进行优化,
先放个板子
之后再根据例题看怎么应用。
code
矩阵优化dp的适用范围
基本上就是对于一个线性递推式,我们构造一个答案矩阵,再构造一个转移矩阵,每次将这个转移矩阵进行快速幂,然后我们用答案矩阵去乘转移矩阵,具体就是一个快速幂的实现。
例题
举个很板的栗子。
斐波那契数列
我们都知道斐波那契数列里面有这个递推式
这个时候我们就可以用上面矩阵乘法的思路来进行求解:
step 1 : 构造一个答案矩阵
step 2 : 我们还需要构造一个转移矩阵,这个转移矩阵就是依据我们的上面的线性递推式得出来的。
step 3 : 接下来就是进行一个快速幂的计算。进行多少次,取决于你希望让这个答案的位置位于我们这个答案矩阵的第几个位子,若让我们的答案为答案矩阵的第二项,我们将进行
code
但是我们发现,我们构造出来的转移矩阵中,第一横行都为
新的答案矩阵
T1
这个可以作为一个很好的练习题,既不难,又可以检验之前学会了没有。
这个时候我们知道了广义斐波那契数列的递推式:
还是和上面的步骤一样,构造矩阵,然后转移。
不难得出我们的答案矩阵为
之后即是相同的矩阵快速幂。
这个题目用来做一个提升感觉并不为过。
这个题目我们将会用到一种技巧,因为我们在转移的时候不是仅仅只有 dp 数组的转移,还要考虑带个常数,所以说我们会采取一个扩维的方法,单独扩出来一维,放上 1,然后转移我们那个拼接的数字。
之后就是我们的转移方程了(不会有人不会推吧):
我们这个题目可以用来学习到一个解决问题的方法。
对于我们要求的矩阵的幂次和,我们可以采取二次分治的思想。
不断递归然后求解。具体详细内容见我题解。
这个题目又会给我们引申出来一个知识点:拆点。
对于这个拆点这个概念我们可以对应分层图的思想来看。
这是对于要运用矩阵乘法但是边权不仅仅只为一的时候,我们可以在两个边权不为一的点建立边权个点。中间的虚点仅做转移运算用,而不存在任何实际意义,所以最后统计答案不可以加上虚点的答案。
对于这个题目:我们可以将每个点拆成九个,然后每一个点
不可以在某一个点逗留。
我们矩阵
然后经过
附上代码:
code
我们看到
我们不难可以考虑到我们这个计数的式子是这样:
我们得到这个式子之后不难想到后面这个维度判断我们可以构造一个矩阵
再构造一个
code
快读快写部分略去。
这个题目我们要引申出来一个
对于一个邻接矩阵
, 就是经过 后的状态。
运用这个知识我们就能想到,
__EOF__

本文链接:https://www.cnblogs.com/carp-oier/p/Matrix.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!