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 }