参考:http://www.cnblogs.com/nuoyan2010/archive/2012/10/17/2728289.html
#include<iostream> #include<cstdio> using namespace std; const int N = 505; int num1[N],num2[N],f[N][N]; int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&num1[i]); scanf("%d",&m); for(int j=1;j<=m;j++)scanf("%d",&num2[j]); memset(f,0,sizeof(f)); int answer=0; int ma; for(int i=1;i<=n;i++) { ma=0; for(int j=1;j<=m;j++) { f[i][j]=f[i-1][j]; if(num1[i]>num2[j]&&f[i-1][j]>ma)ma=f[i-1][j]; if(num1[i]==num2[j])f[i][j]=ma+1; } } for(int j=0;j<=m;j++)answer=max(answer,f[n][j]); printf("%d\n",answer); if(t!=0)printf("\n"); } return 0; }