[动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下。
所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法。

这类题目分为如下三个步骤:(都是对于常系数齐次递推问题)
1先不考虑修改,不考虑区间,直接列出整个区间的dp方程。这个是基础,动态dp无论如何还是dp(这一步是一般是重点)
2.列出转移矩阵。由于有很多修改操作,我们将数据集中在一起处理,还可以利用矩阵结合律,并且区间比较好提取,(找一段矩阵就好了),修改也方便。
3.线段树维护矩阵。对于修改,我们就是在矩阵上进行修改,对于不同的题目,我们要用不同的修改方式,和记录手段。但是都是线段树一个节点维护的是这个区间内矩阵的信息。如矩阵乘积,矩阵和等等。线段树的区间优势,可以应对区间修改问题。
T1:HDU5068


这里,由于是单点修改,所以直接到叶子节点,修改后再pushup就可以了。
线段树维护区间内矩阵乘积。
T2:CF Sasha and Array

就是斐波那契数列。


这里的可以原因是:提出B,因为矩阵右分配律,再提出一个M^x,还是矩阵右分配律。注意这里M^x,B是不能交换顺序的。但是M^x放在求和的前边乘,还是后边乘是无所谓的。因为都是M
可以用左分配律,也可以用右分配律。
其实代码不难想。
1.laz标记应当建一个和t[4*N]一样的laz[4*N],这样,每个结构体只存一个矩阵a,不但节省空间,而且内置函数的矩阵乘法还方便,因为无论如何都转移到a矩阵,而不用考虑是a乘laz还是laz乘laz。
2.数组越界了,被卡了很长时间。开a[3][3]就可以,没有发现的原因是,c++本地编译不会RE,放到CF上就会出现奇怪答案,而且莫名有的地方数组内的值就变了,比如说突然都变成0
3.注释不要太多,以免掩盖正解,导致把laz 下放注释掉了。。。
T3:

本质不同:不一样。长度不同,或者长度一样对应位置数字不全一样。
注意是子序列不是子串

注意,为什么用f[i][0/1]?因为当最后一位不一样时,这两个子序列一定不一样,所以f[i-1][0]和f[i-1][1]中的每一个都是不一样的。
并且,这还跟原数组数值0/1挂钩,很好联系上了。
加的一个1是就取这一位,其实是之前每一个都多了一位,就没有了最初的长度为一的子序列。所以加上。


也就是说,区间矩阵乘积结果的矩阵可以直接进行翻转,先翻再乘,和先乘再翻没区别。
直接正常维护就好,加一个rev标记。
[动态dp]线段树维护转移矩阵的更多相关文章
- luoguP4719 【模板】动态 DP 线段树+树链剖分+矩阵乘法+动态DP
题目描述 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y,表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入输出格式 输入格式: 第一行,n,m分 ...
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...
- Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵
Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries ...
- bzoj 5294: [Bjoi2018]二进制【动态dp+线段树】
不太清楚是不是动态dp--? 这个维护其实和最大连续子段差不多,维护l[x][y],r[x][y],m[x][y]分别表示包含左儿子的01个数为(x,y)的区间个数,包含右儿子的01个数为(x,y)的 ...
- DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE
题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...
- 【HMOI】小C的填数游戏 DP+线段树维护
[题目描述] 一个长为n的序列,每个元素有一个a[i],b[i],a[i]为0||1,每个点和他相邻的两个点分别有两条边,权值为cost1[i],cost2[i],对于每个区间l,r,我们可以给每一个 ...
- SP1716 GSS3 - Can you answer these queries III - 动态dp,线段树
GSS3 Description 动态维护最大子段和,支持单点修改. Solution 设 \(f[i]\) 表示以 \(i\) 为结尾的最大子段和, \(g[i]\) 表示 \(1 \sim i\) ...
- 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp
题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含 ...
- 2019牛客暑期多校训练营(第二场)E 线段树维护dp转移矩阵
题意 给一个\(n\times m\)的01矩阵,1代表有墙,否则没有,每一步可以从\(b[i][j]\)走到\(b[i+1][j]\),\(b[i][j-1]\),\(b[i][j+1]\),有两种 ...
随机推荐
- 微服务监控zipkin+asp.net core
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 监控目录:微服务监控zipkin.skywalking以及日志ELK监控系列 一.zipkin介绍 zipkin是一种分布式跟踪系 ...
- Http指南(1)
网关:是一种特殊的服务器,作为其他服务器的中间实体使用; Agent代理:所有发布web请求的应用程序都是HTTP Agent代理.Web浏览器其实就是一种代理; HTTP报文是在HTTP应用程序之间 ...
- java使用何种类型表示精确的小数?
问题 java使用何种类型表示精确的小数? 结论 float和double类型的主要设计目标是为了科学计算和工程计算,速度快,存在精度丢失 BigDecimal用来表示任意精确浮点数运算的类,在商业应 ...
- Dubbo(四) Dubbo-Admin项目 Dubbo管理台
前言 在dubbo项目中,有注册中心,消费者,提供者就足以构成一个完整的项目了.但是仅仅有这三个角色,很难对整个项目状态有直观的了解,以及对项目操作. 因此早有前辈对此原因作出了贡献——一个通用的du ...
- Linux下的计算命令和求和、求平均值、求最值命令梳理
在Linux系统下,经常会有一些计算需求,那么下面就简单梳理下几个常用到的计算命令 (1)bc命令bc命令是一种支持任意精度的交互执行的计算器语言.bash内置了对整数四则运算的支持,但是并不支持浮点 ...
- php 中self,this的区别和实地操作
面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意 ...
- spring boot之mybatis配置
配置在application.yml文件中 mybatis-plus: # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Map ...
- Linux课题实践三——程序破解
2.3 程序破解 20135318 刘浩晨 1. 掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即“空指令”.执行到NOP指令时,CPU什么也不做,仅仅当做一 ...
- 20135323符运锦----LINUX第二次实践:内核模块编译
Linux实践二--模块 一.知识点总结 ①Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率 ...
- SQL大杂烩
DML 语句(数据操作语言)Insert.Update. Delete.Merge DDL 语句(数据定义语言)Create.Alter. Drop.Truncate DCL 语句(数据控制语言)Gr ...