最长公共子上升序列(LCIS)

最长公共子上升序列

 AC_Code

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <cstdlib>
 8 #include <algorithm>
 9 using namespace std;
10 typedef long long ll;
11 const int maxn = 1010;
12 const int inf=0x3f3f3f3f;
13 
14 struct node{
15     int len;
16     int ans[maxn];
17 }dp[maxn],maxx;
18 int a[maxn],b[maxn];
19 
20 int main()
21 {
22     int n,m;
23     scanf("%d",&n);
24     for(int i=1;i<=n;i++){
25         scanf("%d",&a[i]);
26     }
27     scanf("%d",&m);
28     for(int i=1;i<=m;i++){
29         scanf("%d",&b[i]);
30     }
31 
32     for(int i=1;i<=n;i++){
33         maxx.len=0;
34         memset(maxx.ans,0,sizeof(maxx.ans));
35         for(int j=1;j<=m;j++){
36             if( a[i]>b[j] && dp[j].len>maxx.len ){
37                 maxx = dp[j];
38             }
39             else if( a[i]==b[j] ){
40                 dp[j]=maxx;
41                 dp[j].len=maxx.len+1;
42                 dp[j].ans[dp[j].len] = b[j];
43             }
44         }
45     }
46 
47     int flag=0;
48     int maxxx=-inf;
49     for(int i=1;i<=n;i++){
50         if( dp[i].len>maxxx ){
51             maxxx = dp[i].len;
52             flag=i;
53         }
54     }
55     printf("%d
",dp[flag].len);
56     for(int i=1;i<=dp[flag].len;i++){
57         printf("%d ",dp[flag].ans[i]);
58     }
59     printf("
");
60     return 0;
61 }
原文地址:https://www.cnblogs.com/wsy107316/p/12244684.html