最长公共子序列

最长公共子序列

匿名 (未验证) 提交于 2019-12-02 23:32:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TONGZONGE/article/details/90245545 最长公共子序列问题:给定两个序列 X={x1,x2,x3......xm}和Y={y1,y1,y3.......yn},找出X和Y的公共子序列。 1、穷举法是最容易想到的算法。对于X的所有序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列。并且在检查中记录最长公共子序列。因此,共有2^m个子序列,从而穷举法需要时间指数。 事实上,最长公共子结构问题具有最优子结构的性质. 设序列X={x1,x2,x3......xm}和Y={y1,y1,y3.......yn}的最长公共子系列为Z={z1,z2,z3........zK},则: (1) 若xm=yn,则Zk=Xm=Yn,且Zm-1是Xm-1和Yn-1的最长公共子序列; (2)若xm!=yn,且Zk!=Xm,,则Z是Xm-1和Y的最长公共子序列; (3)若xm!=yn,且Zk!=Yn,,则Z是X和Yn-1的最长公共子序列; 2、子问题的递归问题 3、计算最优值 public class 最长公共子序列序列 { public static int IcsLength ( char [] x , char [] y , int [][] b ) { int

noj 1041 最长公共子序列

北城以北 提交于 2019-12-02 12:56:26
# include <iostream> # include <queue> # include <set> # include <vector> # include <string> # include <algorithm> # include <stdlib.h> using namespace std ; string a , b ; int common [ 205 ] [ 205 ] ; void init ( ) ; void dp ( ) ; int main ( ) { init ( ) ; dp ( ) ; cout << common [ a . size ( ) ] [ b . size ( ) ] << endl ; return 0 ; } void dp ( ) { for ( int i = 1 ; i <= a . size ( ) ; i ++ ) { for ( int j = 1 ; j <= b . size ( ) ; j ++ ) { if ( a [ i - 1 ] == b [ j - 1 ] ) { common [ i ] [ j ] = common [ i - 1 ] [ j - 1 ] + 1 ; } else { common [ i ] [ j ] = max ( common [ i - 1 ] [ j ] ,

【模板】最长公共子序列

青春壹個敷衍的年華 提交于 2019-12-02 06:45:19
给出1-n的两个排列P1和P2,求它们的最长公共子序列。 (相异) 转化问题成 最长下降子序列 //为了更好的利用之前的信息,便于更新, //我们把原来记录的长度信息,改成如果有这个解,他匹配的最后的元素,的最前面的s1序列的位置是多少 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; int n,x; const int N=100003; int mp[N],f[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&x),mp[x]=i; //work int len=0; memset(f,0x7f,sizeof(f)); for(int i=1;i<=n;i++) { scanf("%d",&x); int pos=upper_bound(f+1,f+len+1,mp[x])-f; f[pos]=mp[x]; if(pos>len) len++; } //output printf("%d\n",len); return 0; } 来源: https://www.cnblogs.com/xwww666666/p/11735112.html

nlog求最长公共子序列

∥☆過路亽.° 提交于 2019-12-01 07:11:16
其实关键在于模型的转化,对于两个数列a,b,我们可以用一个O(n^2)的枚举求出其最长公共子序列,但在一些题中就显然不满足了,所以有了nlog的算法。 首先我们要找到a序列中每个元素在b序列中的位置,这个位置可能有多个,我们将它从大到小排列,对于b中不存在的元素这个位置显然是空集,这样我们就得到了a中每个元素在b中的位置也就是多个集合,且集合内部单调递减,然后按照a中元素的先后顺序,将得到的这多个集合合并在一起,我们可以得到一个新的数列,在这个数列中求最长上升子序列就可以。 算法的正确性很显然,对于新得到的数列,每一个元素都代表了a与b有共同元素,而上升则保证了序列的顺序从前到后。 这里有关键一点,在找a序列在b中位置存储时,要从大到小,这样就放止了对于a中一个元素匹配到b中多个元素的可能性。 洛谷模板题: https://www.luogu.org/problem/P1439 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 #define N 100005 8 int read() { 9 int s=0,f=1; 10 char ch=getchar(); 11

【HAOI2010】最长公共子序列

て烟熏妆下的殇ゞ 提交于 2019-11-30 19:50:22
普通的LCS是经典的DP问题,那么如果加上方案数,则与最短路计数类似的 1.如果相同,就加上方案数 2.如果可以被更新,就重新统计方案数 但在这一题中,有一种特殊情况要考虑 如果一个子串,(i-1,j)和(i,j-1)都是由(i-1,j-1)转移过来,那么如果在更新f(i,j)时,就不可以用(i-1,j-1)继续累加,就应判定这是重复的,由容斥原理可得,应当减去这一方案数。 例外,此题内存限制严格,需用滚动数组 详细见代码 #include<bits/stdc++.h> const int mod=1e8; const int Maxn=5005; int f[2][Maxn],sum[2][Maxn]; char s1[Maxn],s2[Maxn]; using namespace std; inline int read(){ char c=getchar();int fh=0; while(!isdigit(c))c=getchar(); while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar(); return fh; } int main(){ cin>>s1+1>>s2+1; int l1=strlen(s1+1)-1,l2=strlen(s2+1)-1; sum[0][0]=1; for(int i=1;i<=l2;+

c++最长公共子序列

佐手、 提交于 2019-11-30 06:19:17
最长公共子序列 Description Input 第一行:序列A的长度 第二行:给出序列A 第三行:序列B的长度 第四行:给出序列B 长度<=1000 Output 只有一行:表示最长的公共子序列的长度 Sample Input 6 1 6 2 5 4 7 7 0 1 2 5 5 2 7 Sample Output 4 Source #include <bits/stdc++.h> using namespace std; int f[1001][1001]; int n, m, a[1001], b[1001]; int main() { cin >> n; for(int i = 1;i <= n;i ++) { scanf("%d",&a[i]); } cin >> m; for(int i = 1;i <= m;i ++) { scanf("%d",&b[i]); } f[0][0] = 0; f[0][1] = 0; f[1][0] = 0; for(int i = 1;i <= n;i ++) { for(int j = 1;j <= m;j ++) { if(a[i] == b[j]) { f[i][j] = f[i - 1][j - 1] + 1; } else { f[i][j] = max(f[i - 1][j], f[i][j - 1]); } } }

动态规划:最长公共子序列和最长公共子串

孤街醉人 提交于 2019-11-30 06:13:56
一、最长公共子序列问题(LCS问题) 我们首先需要搞清楚以下两个概念:最长公共子序列 VS 最长公共子串: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。 问题描述: 给定两个字符串,求解这两个字符串的 最长公共子序列 (Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB,则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 动态规划解法分析: 设 A=(A1,A2,…An) 和 B={B1,B2,…Bm} 是两个序列,将 A 和 B的最长公共子序列记为 LCS(A,B) 找出LCS(A,B)就是一个最优化问题。因为,我们需要找到A 和 B中最长的那个公共子序列。而要找A 和 B的LCS,首先考虑A的最后一个元素和B的最后一个元素。 如果 An=Bm ,即X的最后一个元素与Y的最后一个元素相同,这说明该元素一定位于公共子序列中。因此,现在只需要找: LCS(An-1,Bm-1) 如果An != Bm ,产生了两个子问题:LCS(An-1,Bm) 和 LCS(An,Bm-1),因为序列A 和 序列B 的最后一个元素不相等,那说明最后一个元素不可能是最长公共子序列中的元素。求解上面两个子问题,得到的公共子序列谁最长,那谁就是 LCS(A,B)。用数学表示就是: LCS

最长公共子序列

断了今生、忘了曾经 提交于 2019-11-29 12:32:27
//poj 1458 Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 69884 Accepted: 29304 Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the

1006 最长公共子序列Lcs

旧时模样 提交于 2019-11-28 16:21:02
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个。 输入样例 abcicba abdkscab 输出样例 abca dp[i][j]:i表示A j表示B 的每一个字符 dp表示I位Aj位B的公共子串的最长长度 若相同:dp[i][j]=dp[i-1][j-1]+1; 否则:dp[i][j]-max(dp[i-1][j],dp[i][j-1]) 因为要输出字串,就用一个direct记录转移的方向 #include<bits/stdc++.h> using namespace std; char a[1010],b[1010]; int Mlen[1010][1010],direc[1010][1010];//0左 1左上 2上 void print(int x,int y) { if(x<0||y<0) return; if(direc[x][y]==2) print(x-1,y); else if(direc[x][y]==0) print(x,y-1); else { print(x-1,y-1)

最长公共子序列(LCS) Easy HDU1599

♀尐吖头ヾ 提交于 2019-11-28 15:37:17
题目: A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a strictly increasing sequence <i1, i2, ..., ik> of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = <a, b, f, c> is a subsequence of X = <a, b, c, f, b, c> with index sequence <1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y. The program input is from a text file. Each data