最长公共子序列

来源:互联网 发布:李克勤护花使者 知乎 编辑:程序博客网 时间:2024/05/16 01:11

/*#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
char sz1[MAX_LEN];
char sz2[MAX_LEN];
int aMaxLen[MAX_LEN][MAX_LEN];
int main(void)
{
    while( scanf("%s%s", sz1+1 ,sz2+1 ) > 0 )
    {
        int nLength1 = strlen( sz1+1);
        int nLength2 = strlen( sz2+1);
        int i, j;*/
        /*for( i = 0;i <= nLength1; i ++ )
            aMaxLen[i][0] = 0;
        for( j = 0;j <= nLength2; j ++ )
            aMaxLen[0][j] = 0
;*/
  /*memset( aMaxLen, 0,sizeof(aMaxLen)  );
        for( i = 1;i <= nLength1;i ++ )
        {
            for( j = 1; j <= nLength2; j ++ )
            {
                if( sz1[i] == sz2[j] )
                    aMaxLen[i][j] = aMaxLen[i-1][j-1] + 1;
                else
                {
                    int nLen1 = aMaxLen[i][j-1];
                    int nLen2 = aMaxLen[i-1][j];
                    if( nLen1 > nLen2 )
                        aMaxLen[i][j] = nLen1;
                    else
                        aMaxLen[i][j] = nLen2;
                }
            }
        }
        printf("%d\n", aMaxLen[nLength1][nLength2]);
    }
    return 0;
}
*/

#include<iostream>
#include<string>
using namespace std;
int main()
{
      int yongli,hang,lie,i,j;
      int a[100][100];
      cin>>yongli;   // 用例个数
      getchar();    //吸收回车
      while(yongli--)
      {
 char x[100],y[100];
 gets(x);        
 gets(y);
 hang=strlen(x);  
 lie=strlen(y);  
 for(i=0;i<=hang;i++) a[i][0]=0;   // 初始化第0列
 for(i=0;i<=lie;i++) a[0][i]=0;  // 初始化第0行
 for(i=1;i<=hang;i++)       
 {
         for(j=1;j<=lie;j++)
                              {
                 if(x[i-1]==y[j-1]) a[i][j]=a[i-1][j-1]+1;   //  如果对应字符相等,就等于左上角加1
                 else    //否则等于左边和上面中最大的数
   {
         if(a[i-1][j]>a[i][j-1]) a[i][j]=a[i-1][j];  
         else a[i][j]=a[i][j-1];
  }
          }   
                     }
                     cout<<a[hang][lie]<<endl;
         }
         return 0;
}