最长公共子序列板/滚动 N^2
#include <bits/stdc++.h> using namespace std; int main() { int i,j,dp[2][10086],t; char a[10086],b[10086]; bool now,pre; scanf("%d",&t); while(t--) { scanf("%s%s",a,b); memset(dp,0,sizeof(dp)); int lena=strlen(a),lenb=strlen(b); for(now=1,pre=0,i=0; i<lena; i++) for(swap(now,pre),j=0; j<lenb; j++) if(a[i]==b[j]) dp[now][j+1]=dp[pre][j]+1; else dp[now][j+1]=dp[pre][j+1]>dp[now][j]?dp[pre][j+1]:dp[now][j]; printf("%d\n",dp[now][lenb]); } return 0; }