D - 最长公共子序列Lcs
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
Input第1行:字符串A 比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
第2行:字符串B
(A,B的长度 <= 1000) Output输出最长的子序列,如果有多个,随意输出1个。 Sample Input
abcicba abdkscabSample Output
abca
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int str[1005][1005]; char a[1004]; char b[1004]; int lena,lenb; void cmp() { for(int i=1; i<=lena; i++) { for(int j=1; j<=lenb; j++) { if(a[i-1]==b[j-1]) { str[i][j] = str[i-1][j-1]+1; ///未改变的dp加上1, } else { str[i][j] = max(str[i-1][j],str[i][j-1]);///取最大值 } } } int i = lena-1; int j = lenb-1; char e[1001]; int t=0; while(i>=0 && j>=0) { if(a[i]==b[j]) { e[t++]=a[i]; i--; j--; } else if(str[i][j+1]>str[i+1][j]) ///比较旁边的和上面的值,去最大值返回。 i--; else j--; } for(int k=t-1; k>=0; k--) { printf("%c",e[k]); } printf("\n"); } int main() { memset(str,0,sizeof(str)); gets(a); gets(b); lena = strlen(a); lenb = strlen(b); cmp(); return 0; }
注:还看不懂,反省上一篇的,去记忆。