HDU1423 最长上升公共子序列

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 205;
 6 int a[ maxn ],b[ maxn ],dp[ maxn ];
 7 int s[ maxn ];
 8 int LCIS( int a[],int b[],int lena,int lenb ){
 9     /*
10     dp[i]:表示当b字符串到了第i个时,与a[]中的符合的最长公共上升子序列
11     */
12     memset( dp,0,sizeof( dp ) );
13     dp[ 0 ]=-1;
14     for( int i=1;i<=lena;i++ ){
15         int locate = 0;
16         for( int j=1;j<=lenb;j++ ){
17             if( a[i]>b[j]&&dp[ locate ]<dp[ j ] ){
18                 locate = j;
19             }
20             if( a[i]==b[j] ){
21                 dp[ j ]=dp[ locate ]>=0?(dp[ locate ]+1):1;
22             }
23         }//当a[i]时,遍历b中的dp最大的那个
24     }
25     int ans = 0;
26     for( int i = 1;i <= lenb; i++ )
27         ans = max( ans,dp[ i ] );
28     return ans;
29 }
30 
31 int main(){
32     int ca;
33     scanf("%d",&ca);
34     while( ca-- ){
35         int n;
36         scanf("%d",&n);
37         for( int i=1;i<=n;i++ )
38             scanf("%d",&a[ i ]);
39         int m;
40         scanf("%d",&m);
41         for( int i=1;i<=m;i++ )
42             scanf("%d",&b[ i ]);
43         printf("%d\n",LCIS( a,b,n,m ));
44         if( ca ) printf("\n");
45     }
46     return 0;
47 }

 

posted @ 2013-03-22 22:18  xxx0624  阅读(260)  评论(0编辑  收藏  举报