zoukankan      html  css  js  c++  java
  • POJ 2127

     1 #include <iostream>
     2 #define MAXN 501
     3 using namespace std;
     4 
     5 int a[MAXN],b[MAXN],ans[MAXN];
     6 
     7 int GCIS(int l1, int *a, int l2, int *b);
     8 
     9 int main()
    10 {
    11     //freopen("acm.acm","r",stdin);
    12     int l_1;
    13     int l_2;
    14     int i;
    15     int j;
    16     int ans_max;
    17 //    cin>>l_1;
    18     scanf("%d",&l_1);
    19 
    20     for(i = 0; i < l_1; ++ i)
    21     {
    22     //    cin>>a[i];
    23         scanf("%d",&a[i]);
    24     }
    25 
    26 //    cin>>l_2;
    27     scanf("%d",&l_2);
    28     for(i = 0; i < l_2; ++ i)
    29     {
    30         //cin>>b[i];
    31         scanf("%d",&b[i]);
    32     }
    33 
    34     cout<<(ans_max = GCIS(l_1,a,l_2,b) )<<endl;
    35 
    36     for(i = 0; i < ans_max; ++ i)
    37     {
    38         cout<<ans[i]<<" ";
    39     }
    40     cout<<endl;
    41 
    42 }
    43 
    44 
    45 /////////////////////////////////////
    46 //最长公共上升子序列~
    47 /////////////////////////////////////
    48 int GCIS(int l1, int *a, int l2, int *b)//ans[0...DP[max]-1]为序列,最长公共递增子序列!
    49 {
    50     int f[MAXN+1][MAXN+1];
    51     int DP[MAXN+1];
    52     int i,j,k,max; 
    53     memset(f,0,sizeof(f));
    54     memset(DP,0,sizeof(DP));
    55     for (i=1;i<=l1;i++)
    56     {
    57         k=0;
    58         for(int kk = 1;kk <= l2;++ kk)
    59         {
    60             f[i][kk] = f[i-1][kk];
    61         }
    62         for (j=1;j<=l2;j++)
    63         {
    64             if(b[j-1] < a[i-1] && DP[j] > DP[k])
    65                 k=j;
    66             if(b[j-1]==a[i-1]&&DP[k]+1>DP[j])
    67             {
    68                 DP[j]=DP[k]+1;
    69                 f[i][j]=i*(l2+1)+k; 
    70             }    
    71         } 
    72     }
    73     max=0;
    74     for(i=1;i<=l2;i++)
    75     {
    76         if (DP[i]>DP[max])
    77         max=i;
    78     }
    79     i=l1*l2+l1+max; 
    80     for(j = DP[max];j > 0;j --)
    81     {
    82         ans[j-1] = b[i%(l2+1)-1]; 
    83         i=f[i/(l2+1)][i%(l2+1)];
    84     } 
    85     return DP[max];
    86 }
    87 ///////////////////////////////////////////////////
    88 //返回值是子序列的容量,容器为ans[]
    89 ///////////////////////////////////////////////////

    关注我的公众号,当然,如果你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。 

    技术网站地址: vmfor.com

  • 相关阅读:
    2017ecjtu-summer training # 9 HDU 4544
    2017ecjtu-summer training #6 Gym 100952D
    HDU 1241 DFS
    集训队选拔赛 day4
    Educational Codeforces Round 67 (Rated for Div. 2)
    Codeforces Round #566 (Div. 2)
    Codeforces Round #567 (Div. 2)
    Codeforces Round #568 (Div. 2)
    Codeforces Round #569 (Div. 2)
    牛客练习赛48
  • 原文地址:https://www.cnblogs.com/gavinsp/p/4566671.html
Copyright © 2011-2022 走看看