#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
char a[N],b[N];
int f[N][N];
int main(){
cin>>n>>m>>a+1>>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];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
char a[200]="ADABBC";
char b[200]="DBDCA";
char f[201][201];//长度数组
char p[201][201];//前驱数组
int m,n;
void LCS(){
int i,j;
m=strlen(a);
n=strlen(b);//m*n的二维矩阵
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i-1]==b[j-1]){//注意下标,因为是字符串
f[i][j]=f[i-1][j-1]+1;
p[i][j]=1;//左上方
}else if(f[i][j-1]>f[i-1][j]){
f[i][j]=f[i][j-1];
p[i][j]=2;//左边
}else{
f[i][j]=f[i-1][j];
p[i][j]=3;//上边
}
}
}
printf("%d\n",f[m][n]);
}
void getLCS(){//倒推公共子序列,蛇形走位
int i,j,k;
char s[200];
i=m;j=n;k=f[m][n];
while(i>0&&j>0){
if(p[i][j]==1){//左上方
s[k--]=a[i-1];
i--;j--;//倒推
}else if(p[i][j]==2){//左边
j--;
}else{//上边
i--;
}
}
for(i=1;i<=f[m][n];i++){
printf("%c",s[i]);
}
}
int main(){
LCS();//输出最长长度
getLCS();//输入子序列
return 0;
}
#include <bits/stdc++.h>
using namespace std;
char a[200]="ABACCB";
char b[200]="AACCAB";
int f[201][201];
int main(){
int ans=0;
for(int i=1;i<=strlen(a);i++){
for(int j=1;j<=strlen(b);j++){
if(a[i-1]==b[j-1]){
f[i][j]=f[i-1][j-1]+1;
}else{
f[i][j]=0;
}
ans=max(ans,f[i][j]);
}
}
printf("ans=%d\n",ans);
return 0;
}