最长公共子序列模板

/*
状态转移方程:
re[i][j]=max(re[i-1][j],re[i][j-1],re[i-1][j-1]+(a[i]==b[j]))
re[i][j]:长度为i的a串和长度为j的b串的公共最长子序列长度
*/
#define maxn 1006
int re[maxn][maxn];
int Max(int a,int b,int c)
{
    if(a<b)
        a=b;
    if(a<c)
        a=c;
    return a;
}        
int main()
{
    int t,i,j;
    char a[maxn],b[maxn];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s %s",a+1,b+1);
        memset(re,0,sizeof(re));
        int lena=strlen(a),lenb=strlen(b);
         for(i=1;i<lena;++i)
           for(j=1;j<lenb;++j)
           {
               re[i][j]=Max(re[i-1][j],re[i][j-1],re[i-1][j-1]+(a[i]==b[j]));
           }
           printf("%d\n",re[lena-1][lenb-1]);
    }
    return 0;
} 

 

posted @ 2013-04-30 22:44  小仪在努力~  阅读(160)  评论(0编辑  收藏  举报