dp(i,j)的功能是返回前缀i,j的LCS长度。
转移方程:
{dp(i,j)=dp(i−1,j−1)+1,s1[i]==s2[j]dp(i,j)=max(dp(i,j−1),dp(i−1,j)),s1[i]≠s2[j]dp(0,x)=0,1≤x≤n2dp(x,0)=0,1≤x≤n1
\left\{
\begin{array}{lr}
dp(i,j)=dp(i-1,j-1)+1,s_1[i]==s_2[j]\\
dp(i,j)= max(dp(i,j-1),dp(i-1,j)),s_1[i]\ne s_2[j]\\
dp(0,x)=0,1\le x\le n_2\\
dp(x,0)=0,1\le x\le n_1\\
\end{array}
\right.
⎩⎪⎪⎨⎪⎪⎧dp(i,j)=dp(i−1,j−1)+1,s1[i]==s2[j]dp(i,j)=max(dp(i,j−1),dp(i−1,j)),s1[i]=s2[j]dp(0,x)=0,1≤x≤n2dp(x,0)=0,1≤x≤n1
不说了,直接代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int NN=1100;
int n1,n2;
int record[NN][NN];
char s1[NN],s2[NN];
int dp(int i,int j){
if(i==0||j==0)return 0;
if(record[i][j]>=0)return record[i][j];
if(s1[i]==s1[j]){
return dp(i-1,j-1)+1;
}
else{
return max(dp(i,j-1),dp(i-1,j));
}
}
int main(){
scanf("%s",s1+1);
scanf("%s",s2+1);
n1=strlen(s1+1);
n2=strlen(s2+1);
memset(record,-1,sizeof(record));
printf("%d\n",dp(n1,n2));
return 0;
}
结果: