最长公共子序列的记忆化搜索模板
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)) ; }
下面这个是递推方法的模板,字母解释同上,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] ; }