1 /* 2 状态转移方程如下 ai,bj分别代表a字符串和b字符串的i,j处的字符 3 4 -> 0 (i = j =0) 5 v[i,j] = -> v[i-1][j-1] (ai == bj) 6 -> Max(v[i-1][j],v[i][j-1]) (ai != bj) 7 */ 8 #include<cstdio> 9 #include<cstring> 10 #define Max(a,b) ((a)>(b)?(a):(b)) 11 using namespace std; 12 13 char a[1005],b[1005]; 14 int v[1005][1005]; 15 int n,i,j; 16 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 while(n--) 22 { 23 scanf("%s%s",a,b); 24 for(i=0; a[i]!='\0'; ++i) 25 { 26 for(j=0; b[j]!='\0'; ++j) 27 { 28 if(a[i] == b[j]) 29 v[i+1][j+1] = v[i][j] + 1; 30 else 31 v[i+1][j+1] = Max(v[i][j+1],v[i+1][j]); 32 } 33 } 34 printf("%d\n",v[i][j]); 35 } 36 return 0; 37 }
1 //空间优化,只有一维时,v[i-1][j-1]会被覆盖,所以只需要开一个变量存储v[i-1][j-1]即可 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 char a[1005],b[1005]; 7 int v[1005]; 8 int n,i,j,t,temp; 9 10 int main() 11 { 12 scanf("%d",&n); 13 while(n--) 14 { 15 scanf("%s%s",a,b); 16 memset(v,0,sizeof v); 17 for(i=0; a[i]!='\0'; ++i) 18 { 19 t = 0; 20 for(j=0; b[j]!='\0'; ++j) 21 { 22 temp = v[j]; 23 if(a[i] == b[j]) 24 v[j] = t + 1; 25 else if(v[j] < v[j-1]) 26 v[j] = v[j-1]; 27 t = temp; 28 } 29 } 30 printf("%d\n",v[j-1]); 31 } 32 return 0; 33 }