#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <stack>
#include <map>
#include <vector>
using namespace std;
int dp[1000][1000]={0};
int main(int argc, const char * argv[]) {
string s1,s2;
while(cin >> s1 >>s2)
{
int len1 = s1.length();
int len2 = s2.length();
s1.insert(0,"a");//随便在0位上填个东西
s2.insert(0,"a");
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
{
if(s1[i]==s2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
int ans= dp[len1][len2];
cout<<ans<<endl;
}
return 0;
}
思路:dp[i][j]保存的是s1中1-i子串和s2中1-j子串的最大公共子串长度;
1、if(i==0 || j==0) dp[i][j]=0;
2、if(s1[i]==s2[j] ) dp[i][j]=dp[i-1][j-1]+1;
3、if(s1[i]!=s2[j]) dp[i][j]=max(dp[i-1][j],dp[i][j-1])l