LCS模板题。刚开始令maxn=1e4,爆内存,时间上优化需要用到后缀数组(表示还没学……),空间上优化可采纳滚动数组的用法
#include<bits/stdc++.h> using namespace std; const int maxn=1e3;//maxn=1e4会内存超限 char a[maxn],b[maxn]; int dp[maxn][maxn]; int main() { while(scanf("%s%s",a,b)==2) { memset(dp,0,sizeof(dp)); int lena=strlen(a),lenb=strlen(b); for(int i=1;i<=lena;i++) { for(int j=1;j<=lenb;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[lena][lenb]); } return 0; }
#include<bits/stdc++.h> using namespace std; const int maxn=1e4; char a[maxn],b[maxn]; int dp[2][maxn]; int main() { while(scanf("%s%s",a,b)==2) { memset(dp,0,sizeof(dp)); int lena=strlen(a),lenb=strlen(b); int flag=1; for(int i=1;i<=lena;i++) { for(int j=1;j<=lenb;j++) { if(a[i-1]==b[j-1]) dp[flag][j]=dp[!flag][j-1]+1; else dp[flag][j]=max(dp[!flag][j],dp[flag][j-1]); } flag=!flag; } printf("%d\n",dp[!flag][lenb]); } return 0; }