Greatest Common Increasing Subsequence
1 /*HDU1423 最长公共递增*/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 using namespace std; 6 #define N 550 7 int dp[N][N]; 8 int s[N],t[N]; 9 10 int main() 11 { 12 int t1; 13 while(scanf("%d",&t1)!=EOF) 14 { 15 while(t1--) 16 { 17 int n,m; 18 scanf("%d",&n); 19 for(int i=1;i<=n;i++) 20 scanf("%d",&s[i]); 21 scanf("%d",&m); 22 for(int i=1;i<=m;i++) 23 scanf("%d",&t[i]); 24 memset(dp,0,sizeof(dp)); 25 int mx=0; 26 for(int i=1;i<=n;i++) 27 { 28 mx=0; 29 for(int j=1;j<=m;j++) 30 { 31 dp[i][j] = dp[i-1][j]; 32 if( s[i]>t[j]) 33 { 34 mx=dp[i-1][j]; 35 } 36 if( s[i] == t[j] ) 37 { 38 dp[i][j]=mx+1; 39 } 40 } 41 } 42 mx=-1; 43 int id; 44 for(int i=1;i<=m;i++) 45 if(dp[n][i]>mx) 46 { 47 mx=dp[n][i]; 48 } 49 printf("%d\n",mx); 50 if(t1!=0) printf("\n"); 51 } 52 } 53 return 0; 54 }