对于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;
}

京公网安备 11010502036488号