897. 最长公共子序列
用\(f(i,j)\)表示子序列\(a_i\)和\(b_i\)的最长公共子序列的长度
当\(a_i = b_i\)时,找出\(a_{i-1}\)和\(b_{i-1}\)的最长公共子序列,然后在其尾部加上\(a_i\)即可得到\(a\)和\(b\)的最长公共子序列。
当\(a_i ≠ b_i\)时,求解两个子问题:
- 求\(a_{i-1}\)和\(b_i\)的最长公共子序列
- 求\(a_i\)和\(b_{i-1}\)的最长公共子序列
然后取其中较大者。
const int N=1010;
char a[N],b[N];
int f[N][N]//前一个字符串的前i位与后一个字符串的前j位的最长公共子序列长度
int n,m;
int main()
{
cin>>n>>m;
scanf("%s",a+1);
scanf("%s",b+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i] == b[j]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
cout<<f[n][m]<<endl;
//system("pause");
}