南阳36

 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 }

 

posted @ 2017-04-07 15:49  Posase  阅读(145)  评论(0编辑  收藏  举报