对于s1的某个位置i,s2的某个位置j。这两个位置之前的最长公共子序列等于=如果这两个位置相同的话就是前面的位置加一。如果不同的话就得比较s1前一位或s2前一位谁比较大了。
#include <bits/stdc++.h>

using namespace std;
const int maxn = 5000+10;
int dp[maxn][maxn];
string s1, s2;

int main() {
    while (cin>>s1>>s2) {
        if (s1[0]==s2[0]) dp[1][1] = 1;
//         memset(dp,0,sizeof(dp));
        int ans = 0;
        for (int i=1;i<=s1.size();i++) {
            for (int j=1;j<=s2.size();j++) {
                if (s1[i-1]==s2[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[s1.size()][s2.size()]<<endl;
    }
    
    return 0;
}