这道题如果用动态规划的思想,就很简单;我开始用的是暴力法,一直wa;后来改用动态规划,开始我的内存超了,然后我有吧把Max从10010改成505就过了。
思路:
从后往前进行推导:
当a[i]==b[j]时:dp[i][j]=dp[i-1][j-1]+1;
当a[i]!=b[j]时:dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define Max 505 using namespace std; char a[Max],b[Max]; int dp[Max][Max]; int main(void) { int lena,lenb; freopen("in.txt","r",stdin); while(scanf("%s %s",a+1,b+1)!=EOF) { memset(dp,0,sizeof(dp)); lena=strlen(a+1); lenb=strlen(b+1); for(int i=1;i<=lena;i++) for(int j=1;j<=lenb;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]); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); printf("%d ",dp[lena][lenb]); } fclose(stdin); return 0; }