#include <iostream> using namespace std; int dp[1010][1010]; int main() { int n,m;cin>>n>>m; string a,b;cin>>a>>b; // a = a+"@"; // b = b+"#"; for(int i = 0;i<=n;i++){ dp[i][0] = 0; } for(int j = 0;j<=m;j++){ dp[0][j] = 0; } for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;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]); } } } cout<<dp[n][m]; return 0; } // 64 位输出请用 printf("%lld")
dp[i][j]数组表示字符串a前i个字符和字符串b前j个字符相等的字符个数,他只有三个值为相等时为dp[i-1][j-1]+1,不等时dp[i][j-1],dp[i-1][j]。