O(nlogn)LIS及LCS算法】的更多相关文章

morestep学长出题,考验我们,第二题裸题但是数据范围令人无奈,考试失利之后,刻意去学习了下优化的算法 一.O(nlogn)的LIS(最长上升子序列) 设当前已经求出的最长上升子序列长度为len.先判断A[t]与D[len].若A [t] > D[len],则将A[t]接在D[len]后将得到一个更长的上升子序列,len = len + 1, D[len] = A [t]:否则,在D[1]..D[len]中,找到最大的j,满足D[j] < A[t].令k = j + 1,则有A [t] &…
序: 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:…
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由于是用迭代法,所以计算DP[i][j]前,DP[i-1][j]和DP[i][j-1]就都已经计算出来了,不难理解就可以得出状态转移方程: DP[i][j]  = DP[i-1][j-1] + 1;   如果a[i] == b[j] MAX(DP[i-1][j], DP[i][j-1])  如果a[i…
nlogn 模板 最长上升 #include<bits/stdc++.h> using namespace std; ; int n,x,y,a[N],num[N],d[N],len; /* int binary_search(int i){ int left,right,mid; left=0,right=len; while(left<right){ mid = left+(right-left)/2; if(ans[mid]>=arr[i]) right=mid; else…
转自:http://hzzy-010.blog.163.com/blog/static/79692381200872024242126/  好详细~~~也十分好理解~~~ 最长公共子序列问题(非连续的) 首先将要看到如何运用动态编程查找两个 DNA 序列的最长公共子序列(longest common subsequence,LCS).发现了新的基因序列的生物学家通常想知道该基因序列与其他哪个序列最相似.查找 LCS 是计算两个序列相似程度的一种方法:LCS 越长,两个序列越相似. 子序列中的字符…
o(n^2)解法就不赘述了,直接解释o(nlogn)解法 LIS最长递增子序列: 先明确一个结论:在长度最大为len的递增序列里若末尾元素越小,该递增序列越容易和后面的子序列构造出一个更长的递增子序列.也即认为,长度为len的递增子序列中末尾元素最小的那种最需要保留.我们不妨称这个目前找到序列为到目前为止的 最优序列. 因此设置一个数组lis[i]其中 i 表示此时最大递增序列的长度,数组值表示此时达到 i 的最优序列(也即 长度为len的递增子序列中末尾元素最小的那种)的末尾元素. 那么此时只…
LIS(nlogn) #include<iostream> #include<cstdio> using namespace std; ; int a[maxn]; int n; int lis[maxn]; ; int find(int x){ ,r=len,m; while(l<r){ m=l+(r-l)/; if(lis[m]>=a[x]){//这里若去掉等号即为 非严格递增序列 r=m; } else{ l=m+; } } return l; } int mai…
LIS的nlogn的优化:LIS的优化说白了其实是贪心算法,比如说让你求一个最长上升子序列把,一起走一遍. 比如说(4, 2, 3, 1, 2,3,5)这个序列,求他的最长上升子序列,那么来看,如果求最长的上升序列,那么按照贪心,应该最可能的让该序列的元素整体变小,以便可以加入更多的元素.现在开辟一个新的数组,arr[ 10 ], { .......} --> 这个是他的空间 ,现在开始模拟贪心算法求解最长上升子序列,第一个数是4,先加进去,那么为{ 4 }再来看下一个数2,它比4小,所以如果他…
动态规划算法 #include <iostream> #include <string.h> #include <algorithm> #include <math.h> using namespace std; #define MAXSTRLEN 20 int Lcs(char x[], char y[], int path[][MAXSTRLEN])//求序列x和y的最长公共子序列,path保存路径指向,以方便打印公共子序列 { int i, j; ;…
//LD最短编辑路径算法 public static int LevenshteinDistance(string source, string target) { int cell = source.Length; int row = target.Length; if (cell == 0) { return row; } if (row == 0) { return cell; } int[, ] matrix = new int[row + 1, cell + 1]; for (var…