经典线性DP,转移方程如下:
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
这道题要注意会出现空格,WA了两次。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000+5;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main(){
while(fgets(a,sizeof(a),stdin)!=NULL){
fgets(b,sizeof(b),stdin);
int n=strlen(a)-1,m=strlen(b)-1;
//初始化边界
for(int i=0;i<n;++i) dp[i][0]=0;
for(int j=0;j<m;++j) dp[0][j]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
printf("%d\n",dp[n][m]);
}
return 0;
}
如有不当之处欢迎指出!