O(nlogn)实现LCS与LIS】的更多相关文章

序: LIS与LCS分别是求一个序列的最长不下降序列序列与两个序列的最长公共子序列. 朴素法都可以以O(n^2)实现. LCS借助LIS实现O(nlogn)的复杂度,而LIS则是通过二分搜索将复杂度从n^2中的朴素查找导致的n降至logn使之整体达到O(nlogn)的复杂度. 具体解析: http://www.cnblogs.com/waytofall/archive/2012/09/10/2678576.html LIS代码实现: /* About: LIS O(nlogn) Auther:…
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出 一个数,即最长公共子序列的长度 输入样例 5 3 2 1 4 5 1 2 3 4 5 输出样例 3 说明 对于50%的数据,n≤1000 对于100%的数据,n≤100000 思路 常见的LCS问题是通过O(n2)的DP解决的,显然此题的数据是过不去的 如何想办法? 这里就要参考在特殊条件下LCS与LIS(最长上升序列)的转换 我们记录下第一个…
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4990 分析 首先可以看出一个简单的DP dp[i][j]表示序列a前i个与序列b前j个连线数量 dp[i][j]=max(dp[i−1][j],dp[i][j−1],dp[i−1][j−1](∣a[i]−b[j]∣<=4)) 这样DP的时间复杂度为O(n^2) 发现该方程除了转移的判断条件之外和LCS并无什么不同,因此可考虑LCS的优化方法 提示:阅读下面内容前,请先确保自己掌握一般情况下…
标题效果:有两个长度p+1和q+1该序列.的各种元素的每个序列不是相互同.并1~n^2之间的整数.个序列的第一个元素均为1. 求出A和B的最长公共子序列长度. 分析:本题是LCS问题,可是p*q<=62500,O(pq)的算法显然会LE.在这里有一个条件,每一个序列中的各个元素互不同样,所以能够把A中元素又一次编号为1~p+1.比如,例子中A={1,7,5,4,8,3,9},B={1,4,3,5,6,2,8,9}.因此把A又一次编号为{1,2,3,4,5,6,7}.则B就是{1,4,6,3,0,…
题目大意 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 题解 这个是大白书上的例题,不过这题真的很好,很考验思维.因为p和q都是250^2=62500,如果用LCS的话时间复杂度是O(pq),显然会超时....不过这题的两个序列很特殊,就是没有重复的元素,这样可以把A中的元素重新编号为1~p+1.然后B根据A也重新编号,这样,新的A和B的LCS实际上就是新的B的LIS.LIS可以在O(…
题目链接 BZOJ1264 题解 平凡的\(LCS\)是\(O(n^2)\)的 显然我们要根据题目的性质用一些不平凡的\(LCS\)求法 这就很巧妙了,, 我们考虑\(A\)序列的每个位置可能匹配\(B\)位置的哪些位置 而\(A\)序列中匹配的位置一定是单调递增的 那么我们就把\(A\)的每个位置所能匹配\(B\)的位置找出来,降序排列替代\(A\)原来的位置 我们就能得到一个新的序列,显然原序列的\(LCS\)就是新序列的\(LIS\) 而由于题目的限制,新序列只能使原序列长度的\(5\)倍…
这道题两个数组都没有重复的数字,用lcs的nlogn再适合不过了 #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #i…
注:最近笔试题经常碰到DP动态规划的问题,但是由于本人没有接触过DP,笔试后看到别人家的答案简洁又漂亮,真的羡慕:难的DP自己可能不会,那再见到常见的LCS和LRS以及LIS为问题总该会吧: 资料参考:segmentfault::SecondLife::https://segmentfault.com/a/1190000002641054 (作者的时间复杂度为nlogn的LIS实现有些问题,在这进行改正) 一:LCS(非连续最长公共子序列)     问题:输入两个字符串 BDCABA 和 ABC…
LIS(Longest Increasing Subsequence)是一类典型的动态规划类问题,简化描述如下: 给定$N(n) = \{1,2...,n\}$的一个排列$P(n)$,求$P(n)$中最长上升子列的长度. 譬如令$n = 6$, $N(6) = \{1,2,3,4,5,6\}$,$P(n) = \{1,4,2,5,3,6\}$. 容易发现$LIS(P(n)) = \{1,2,3,6\} or \{1,4,5,6\}...$. 起初我们拿到问题的思路是这样的,我们试着先分析序列的前…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列的最长公共子列. 思路:LCS转变为LIS,对于每个在第一个数组中出现的数字,将它转变为在第二个数组里出现的位置,注意这个位置要从大到小排,然后对这个数组做LIS. #include<algorithm> #include<cstdio> #include<cmath> #…