LCS

最长公共子序列的记忆化搜索模板

a,b数组分别存两个字符串,dp数组初始化为-1

s1表示a串起始地址,e1表示a串结束地址+1,s2、e2同理表示b串

int LCS(int s1,int e1,int s2,int e2)

{

    if(dp[s1][s2]!=-1)

        return dp[s1][s2] ;

    if(s1==e1 || s2==e2)

        return dp[s1][s2]=0 ;

    if(a[s1]==b[s2])

        return dp[s1][s2]=1+LCS(s1+1,e1,s2+1,e2) ;

    else    

        return dp[s1][s2]=max(LCS(s1,e1,s2+1,e2),LCS(s1+1,e1,s2,e2)) ;

}
View Code

 下面这个是递推方法的模板,字母解释同上,dp数组初始化为0

int LCS(int s1,int e1,int s2,int e2)

{

    memset(dp,0,sizeof(dp)) ;

     for(int i=s1+1 ;i<=e1 ;i++)

          for(int j=s2+1 ;j<=e2 ;j++)

        {

             if(a[i-1]==b[j-1])

                   dp[i][j]=dp[i-1][j-1]+1 ;

              else

                   dp[i][j]=max(dp[i-1][j],dp[i][j-1]) ;

         }

    return dp[e1][e2] ;

}
View Code

 

你可能感兴趣的:(c)