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

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