[noip科普]关于LIS和一类可以用树状数组优化的DP
- 预备知识
 
DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推。例如斐波那契数列的递推求法可以不严谨地认为是DP。当然DP的状态也可以是二维/三维的,某一维的含义也不仅仅是指某个数列的第几项。
树状数组(BIT or fenwick tree):一种高效地动态维护一个序列并动态求取前缀和的数据结构。修改某个元素/求一次前缀和的时间复杂度均为O(logn)
2 LIS
好了现在假设你们都会打树状数组了(如果不会的话,baidu一发吧!顺便把线段树也自学了吧!如果学不会树状数组只把线段树自学了也成因为好像并没有树状数组能干而线段树干不了的事情),让我们做一道例题练习一下吧!。
给出一个长度为n的序列,求LIS长度(LIS,longest increasing sequence,最长上升子序列,子序列定义为从原序列取出的一些未必相邻但保持原先的相对顺序的数,上升子序列满足子序列中前一个数严格小于后面的数)
50% n<=5000,100% n<=50000
50%的数据其实并没有用到树状数组。
O(n^2)的LIS算法:定义f[i]为强制以第i项结尾时的LIS长度。那么从1到n依次求出每个f[i],f[i]可以由f[1...i-1]推出。
好了,现在假设你们都会写50分了。我们考虑把算法优化到能跑50000
首先离散化,将原先的数字对应到1-tot(tot为出现过的数值种类),例如10,10,20,15变成1,1,3,2
那么我们定义g[i]为以数值i结尾的LIS长度,并从左向右扫描原数组,同时维护g数组。扫描1,1,3,2时,g数组变化如下:(未出现的项的值为0)
a.g[1]=1
b.g[1]=1
c.g[1]=1,g[3]=2
d.g[1]=1,g[2]=2,g[3]=2
YY一下我们怎样用g数组完成DP。
接下来我们需要一种数据结构支持单点修改(只增不减)和前缀最大值查询。
首先来一个逗比分块写法维护g数组:将g均分成sz块,维护每一块的最大值。修改可以O(1)完成,前缀最大值查询可以将整块整块的部分用每一块的最大值求,零散部分暴力扫一遍。sz取在sqrt(n)附近的时候效率最高。总时间复杂度O(nsqrt(n)),自信AC。
如果n<=233333?
我们可以树状数组维护g数组。原始的树状数组改造后可以支持单点修改(只增不减)和前缀最大值查询。把树状数组的加法换成取最大值,YY一下。
最后整个g数组的最大值就是答案。
3. LCS
好了,现在假设你们都会nlogn的LIS,让我们来一道例题练习一下吧!
uva10635 Prince and Princess(数据范围是我口胡的)
给出两个1~n的排列(一个1~n的排列中,1-n每个数字出现一次,不重复出现),求LCS(最长公共子序列)长度。50%的数据保证第一个排列为1,2,3,...n按顺序递增的。
n<=233333
50%数据是第二个排列的LIS。很好50分到手。
下面设想一下,把数字重新编号,LCS长度不变。例如,两个序列为1,2,3; 3,2,1.那么a,b,c;c,b,a的答案是和它一样的。那么把数字编号为数字也是可以的。
例如这两个数据:
(1)
4
1 2 3 4
2 3 4 1
(2)
4
4 3 2 1
3 2 1 4
它们的答案是相同的。因为在求解LCS时,我们只关注两个序列某两个下标处的数值是否相同,重新编号没有改变“对应下标位置的数相同”的信息。
那么我们把一个序列重编号为1,2,3...n,对另一个序列也用同样的对应关系重编号(即把第二个序列中每个数改成这个数在第一个序列中出现的下标),跑LIS,自信AC。
4. more about LCS
接下来我们分兵奇袭,用另一条思路得出刚才例题lcs的另一个nlogn做法。
首先自己yy一下LCS的O(n^2)算法。它的状态定义为f[i][j]表示允许使用第一个序列的前i个元素,第二个序列的前j个元素(其中第i个,第j个元素不要求必须使用)
接下来我们修改状态定义(这种事情在优化DP时需要经常干)使得它能优化到nlogn.
新的状态中,f[i][j]表示允许使用第一个序列的前i个元素,第二个序列的前j个元素(其中第一个序列第i个元素不必须使用,第二个序列第j个元素必须使用)
于是我们把原先的DP改成分层的过程,考虑从f[i-1][]求出f[i][],那么这两个数组最多有一个位置不同(只有以第一个序列的第i个元素结尾的答案会发生改变)。
那么我们动态维护这个数组就可以了。假如第一个序列中第i个元素在第二个序列中出现在第k个位置,那么修改f[k]即可(这里已经干掉了第一维)。
f[k]等于什么?等于f[1...k-1]的最大值+1,因为在LCS中前一项一定是第二个序列前面k-1的项中的一项(如果已经是第一项,没有前一项?边界自己处理一下我就不(懒得)写了)。
于是还是树状数组前缀最大值,只增不减的单点修改。
事实上,这个算法只要保证匹配上的位置不多即可。因此1-n每个数字出现5次也是能写的。
http://www.lydsy.com/JudgeOnline/problem.php?id=1264 bzoj1264基因匹配
5。more about BIT&DP
二维树状数组也是可以拿来优化DP的 http://www.lydsy.com/JudgeOnline/problem.php?id=3594 方伯伯的玉米田
坐标系可以转...http://www.lydsy.com/JudgeOnline/problem.php?id=2131 免费馅饼
和树状数组没关系的傻逼题 http://www.lydsy.com/JudgeOnline/problem.php?id=4300
2016.12.31update:终于想到了一道noip题NOIP2012摆花 http://cogs.pro/cogs/problem/problem.php?pid=1270
6. 巩固练习一下LIS
http://www.lydsy.com/JudgeOnline/problem.php?id=3173
http://www.lydsy.com/JudgeOnline/problem.php?id=4660
由于我太弱,所以这里的例题比较少...虚心求dalao们在评论区提供例题。
[noip科普]关于LIS和一类可以用树状数组优化的DP的更多相关文章
- 【转】关于LIS和一类可以用树状数组优化的DP 预备知识
		
原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html 预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法 ...
 - NOIp 数据结构专题总结 (2):分块、树状数组、线段树
		
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) 分块 阅:<「分块」数列分块入门 1-9 by hzwer> 树状数组 Binary Indexed T ...
 - HDU - 5542 The Battle of Chibi(LIS+树状数组优化)
		
The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...
 - NOIP 2013 洛谷P1966  火柴排队 (树状数组求逆序对)
		
对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...
 - nlogn求LIS(树状数组)
		
之前一直是用二分 但是因为比较难理解,写的时候也容易忘记怎么写. 今天比赛讲评的时候讲了一种用树状数组求LIS的方法 (1)好理解,自然也好写(但代码量比二分的大) (2)扩展性强.这个解法顺带求出以 ...
 - Codeforces 486E LIS of Sequence --树状数组求LIS
		
题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...
 - Codevs 3286 火柴排队  2013年NOIP全国联赛提高组  树状数组,逆序对
		
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
 - NOIP 2017 列队 - Splay - 树状数组
		
题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...
 - Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
		
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
 
随机推荐
- mac osx install mysql
			
(1) download mysql dmg (2) install (3) /usr/local/mysql/bin/mysql -u root -p change password
 - IT人经济思维之投资 - 创业与投资系列文章
			
前面笔者写过一个文(IT从业者的职业规划),主要通过笔者的从业道路的经验,介绍了IT从业者的职业选择道路问题,主要从技术.业务和管理三大方面进行了描述.然后,通过文(IT从业者的职业道路(从程序员到部 ...
 - jdb - The Java Debugger
			
jdb 是一个简单的命令行调试器,可以调试本地或远程 Java Virtual Machine. jdb [ options ] [ class ] [ arguments ] options 命令行 ...
 - 一个页面实例化两个ueditor编辑器,同样的出生却有不同的命运
			
今天遇到一个比较怪异的问题,有一项目需要在同一个页面上展现两个ueditor编辑器,在展现时并不任何问题,但当点击了“保存”按钮时就出错了,有其中一个ueditor在asp.net中无法获取编辑器的值 ...
 - Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
			
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - 使用SignalR实现消息提醒
			
Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着Html5中W ...
 - 7 COMPELLING REASONS YOU NEED TO START THE BUSINESS YOU’VE ALWAYS WANTED
			
原文链接:http://lesseesadvocate.com/7-compelling-reasons-need-start-business-youve-always-wanted/ Don’t ...
 - #ifndef _LED_H #endif啥意思?
			
#ifndef _LED_H#ifndef _LED_H ...... ...... #endif 避免重复引用头文件的内容.
 - python爬虫学习(2) —— 爬一下ZOL壁纸
			
我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了. 那怎么办呢,我们尝试使用简单的爬虫来解决这个问题. 0. 本爬虫目标 抓取给定分类「或子分类」网址的内容 分析并得到每个分类下的所有 ...
 - RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)
			
前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...