问题描述:给定两个序列:X[1...m],Y[1...n],求在两个序列中同时出现的最长序列的长度。(不必是连续的)
穷举法:x中的子序列有2^m个。
检查是否存在于Y中--O(n)。
时间显然是不能接受的。。。
动态规划:
设C[i,j] = |LCS(X[1...i],Y[1...j])|,C[i,j]表示序列X[1...i],Y[1...j]的最长LCS,则C[m,n]就是最后的答案。
C[i,j] = C[i-1,j-1] + 1 …… X[i] == Y[j]
C[i,j] = max(C[i-1,j],C[i,j-1]) …… X[i] != Y[j]
。。。。
int LCS (int lenstr,int lench) {//返回LCS的长度 memset(dp,0,sizeof(dp)); int k; for (int i=1;i<=lenstr;i++) { k=i&1; for (int j=1;j<=lench;j++) if (str[i-1] == ch[j-1]) dp[k][j]=dp[k^1][j-1]+1; else dp[k][j]=max(dp[k][j-1],dp[k^1][j]); } return dp[k][lench]; }有时候会求一个串,这两个串是这个串的子序列,求这个串的最小长度。
int lcs(){ for (int i = 1;i <= len1;++i){ for (int j = 1;j <= len2;++j){ if (s1[i-1] == s2[j-1]) dp1[i][j] = dp1[i-1][j-1] + 1; else{ dp1[i][j] = min(dp1[i-1][j],dp1[i][j-1]) + 1; } } } return dp1[len1][len2]; }