#include <iostream>
#include <cstring>
using namespace std;
string a,b;
int dp[100][100];
int fun(int n,int m){ //n,m分别表示两个字符串当前最长公共子序列的位置
if(dp[n][m]>=0)
return dp[n][m];
int ans;
if(n==0||m==0){ //如果到达起始位置
if(a[n]==b[m]) //如果起始位置相同返回1
ans = 1;
else //否则返回0
ans = 0;
}
else if(a[n]==b[m]) //在中间的地方相同
ans=fun(n-1,m-1)+1;
else
ans=max(fun(n-1,m),fun(n,m-1)); //在中间的地方不同,则返回n-1位置和m-1位置的最大值
dp[n][m]=ans;
return ans;
}
int main(){
while(cin>>a>>b){
memset(dp,-1,sizeof dp);
int l1=a.length(),l2=b.length();
int ans=fun(l1-1,l2-1);
cout<<ans<<endl;
}
return 0;
}
最长公共子序列【动态规划】
最新推荐文章于 2024-04-16 21:47:46 发布