[动态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]\),有两种 ...
随机推荐
- KVM虚拟机管理——资源调整
1. 概述2. 计算资源调整2.1 调整处理器配置2.2 调整内存配置3. 存储资源调整3.1 根分区扩展3.2 添加磁盘4. 网络资源调整 1. 概述 KVM在使用过程中,会涉及到计算(CPU,内存 ...
- LVS负载均衡下session共享的实现方式-持久化连接
之前简单介绍LVS负载均衡的高可用方案实施,下面详细说明LVS的session解决方案: LVS算法中,SH算法可以实现将同一客户端的请求总是发送给第一次指定的RS,除非该RS出现故障不能再提供服务. ...
- redis持久化策略梳理及主从环境下的策略调整记录
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...
- nginx域名访问的白名单配置梳理
在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip开放,其他ip的客户端都不能访问.可以通过下面四种方法来达到这种效果:1)针对nginx域名配置所启用的端口(比如80端口)在iptable ...
- python-lambda用法
前言: lambda函数也叫匿名函数,即,函数没有具体的名称. 一.基础 lambda语句构建的其实是一个函数对象.匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果 ...
- [LeetCode] 307. Range Sum Query - Mutable 解题思路
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- QQ使用的使用评价
1:界面以及功能:打开软件之后探出登录窗口,基本功能的登录,找回密码,注册帐号等功能均在比较醒目的位置,界面较为友好. 将注册帐号放在打开软件的第一界面当然是正确的选择,给予用户非常直观的提示(没有帐 ...
- M2事后分析
计划 1. 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 修复了M1阶段的bug,整合前两组的数据.扩充功能,和学霸组达成功能上的一致,对数据库进行信息的完善. 2. 有没有发现你做了一 ...
- EnglishGame
https://github.com/zhangxue520/EnglishGame/blob/master/EnglishGame <程序设计实践I> 题目: 打字训练测试软 ...
- 我的集合学习笔记--LinkedList
一,Node节点: /** * 存储元素基本单位 */ public class Node { Object data; Node pre; Node next; public Node(Node p ...