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 ///////////////////////////////////////////////////
时间: 2024-10-10 20:46:27