状态表示:dp[i][j]表示 字符串a的前i个字符串和字符串b的前j个字符 中最长公共子序列的长度。
状态计算:可以分为两种情况,如果a[i]==b[j],那么状态可以转移为dp[i-1][j-1]+1;如果a[i]!=b[j],那么最长公共子序列为max(dp[i-1][j],dp[i][j-1]).
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1010][1010];
int main(){
int n,m;
cin>>n>>m;
string a,b;
cin>>a>>b;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i]==b[j]){
dp[i+1][j+1]=dp[i][j]+1;
}
else{
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
}
}
}
cout<<dp[n][m];
return 0;
}