矩阵乘法与动态 DP 入门
洛谷:https://www.luogu.com.cn/blog/ningago-lsh/ju-zhen-sheng-fa-yu-dong-tai-dp-ru-men
矩阵乘法及广义矩阵乘法
前置知识:矩阵相关基础概念。
记
定义矩阵加法
矩阵加法有交换律,结合律。
定义矩阵乘法
矩阵乘法满足结合律,对矩阵加法的分配律,但不满足交换律。
定义关于运算
若其存在结合律,则:
若:
对 有(左、右)分配律; 有结合律; 有交换律。
则有:
即满足结合律。
常见的
练习题目:
- B2104 矩阵加法
- B3615 测测你的矩阵乘法
- P3390 【模板】矩阵快速幂
矩阵递推
矩阵可以有效地解决线性组合问题。
斐波那契问题:
,求 。
我们构造矩阵
则
这样我们就可以用另一种方式
注意到这样递推每一项的转移都是一样的,而又知道矩阵有结合律,故
矩阵显然可以使用快速幂,故可以
那么,现在你已经对矩阵递推有一定的了解了,就让我们看一看下面这个简单的例子,来把我们刚刚学到的知识运用到实践中吧!
洛谷 P1707 刷题比赛
第
天 A,B,C 都做了 道题。第 天 A,B,C 都做了 道题。 A 同学第
天刷题数量 ; B 同学第
天刷题数量 ; C 同学第
天刷题数量 。 给定
和其它常数,求出 ,答案取模。
构造矩阵
则有:
则
对矩阵进行快速幂即可
https://www.luogu.com.cn/paste/u9m7bjru
总结:矩阵递推可以做的有:
- 需要加前
项的 dp 值(乘系数),每个函数消耗 个矩阵空位。 - 需要加常数,消耗
空位。 - 需要加下标(
),消耗 空位。 - 需要加常数的下标(
)次方,消耗 空位。 - 需要加下标(
)的 次方,消耗 空位(利用二项式定理)。
其中
练习题目:
- P1939 【模板】矩阵加速(数列)
- P1349 广义斐波那契数列
- P3758 [TJOI2017]可乐
- P2109 [NOI2007] 生成树计数
运用矩阵解决线性组合问题
P3373 【模板】线段树 2
区间加,区间乘,区间求和,。
使用线段树维护。普通的懒标记太麻烦了,故使用矩阵求解。
构造一个节点的矩阵
构造一个节点的懒标记矩阵
则对于区间加
对于区间乘
下放时设置
至此我们可以使用
https://www.luogu.com.cn/paste/ulndkmq8
接下来本质理解一下这种做法。
U226931 Linear function?(原创题,可提交,不卡常(?))
节点的树,每个节点有 > 三个权值。 操作
:对于所有 路径上的节点, 。 操作
:对于所有 路径上的节点, 。 操作
:对于所有 路径上的节点, 。 操作
:求出 路径上 之和。
,答案取模, 。 操作
不是此题重点,可以用操作树实现,在此不赘述。
树上路径问题可以使用树链剖分或 LCT 实现。接下来仅讨论序列区间问题。
还是使用懒标记线段树。构造叶节点的矩阵:
那么非叶节点的矩阵就为
操作
其它操作可以类似构造,即
复杂度
https://www.luogu.com.cn/paste/yfwxrpuw
https://www.luogu.com.cn/paste/y9rc9urr
练习题目:
- P7453 [THUSCH2017] 大魔法师
动态 DP
P4719 【模板】"动态 DP"&动态树分治
个节点的点权树,单点修改,求最大权独立集。
。
考虑没有上司的舞会的做法。
记
容易得到
为了方便修改,我们对树进行实链剖分(LCT 维护)。
记
即
则我们可以用
注意叶节点的
为什么使用竖向量?
因为要适应 Splay 中
的前序遍历关系。
显然在实链结构不改变的情况下,
如何修改?(
)
令
如果把
所以这启发我们维护 access 过程。
access 中,需要修改实儿子。这需要向
如何查询?
把原树根旋转为辅助树的根,即可得出 DP 值为
至此我们通过
https://www.luogu.com.cn/paste/h8cx9ldw
可以总结出使用动态 DP 的前提条件:
- 可以用广义矩阵乘法刻画虚儿子的贡献和实儿子的贡献。
- 在插入一个新虚儿子或删除原有的一个虚儿子时可以快速更新
。 - 更改权值后可以快速更新
。
注意不要把“快速”局限为
P3781 [SDOI2017]切树游戏
个节点的带权树。 操作
:单点修改权值。 操作
:求有多少个非空联通子树,满足树内权值异或和为 。
不固定。答案取模。
容易发现这是个异或卷积,故令
令
先考虑朴素 dp:
实链剖分。
用
利用动态 DP 的基本方法即可。由于模数小,可以
由于除法可能有
需要意识到动态 DP 的虚实儿子转化不是任意加减(乘除或其它),而是插入删除,这会带来很多良好的性质。接下来这题将会体现。
https://www.luogu.com.cn/paste/8rm5r98l
BZOJ5210 最大连通子块和
个节点的带权有根树。 操作
:单点修改权值。 操作
:求 的子树中最大的联通子块的点权和。
,点权有正有负。
利用
利用动态 DP 的基本方法,现在的问题是:
利用插删虚儿子的性质,对每个节点开一个可删堆维护即可。
怎么查询子树的答案?
把
复杂度
https://www.luogu.com.cn/paste/boz9uo5g
练习题目:
- P5024 [NOIP2018 提高组] 保卫王国
- P8820 [CSP-S 2022] 数据传输
- P6021 洪水
谢谢观看。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!