主题思想: 最长公共子序列 LCS
此題是经典dp题之一。 1AC,,主要还是要自己考虑下。
对于字符串a,b
dp[i][j] 表示以字符串a中第i个字符,和b中第j个字符结尾,最长公共子序列的长度。
初始化dp为全0.
if(a[i]==b[j]) then dp[i][j]=dp[i-1][j-1]+1
else dp[i][j]=max(dp[i][j-1],dp[i-1][j]
AC代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1024;
int dp[maxn][maxn];
int LCS(string a,string b){
memset(dp,0,sizeof(dp));
a=" "+a;
b=" "+b;
int n1=a.length();
int n2=b.length();
dp[0][0]=0;
for(int i=1;i<n1;i++){
for(int j=1;j<n2;j++){
if(a[i]==b[j]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
}
}
return dp[n1-1][n2-1];
}
int main()
{
string a,b;
while(cin>>a>>b){
int ans=LCS(a,b);
printf("%d\n",ans);
}
return 0;
}