1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 const int maxx=1001;
5 int n,a[maxx][5];//a[x][1]记录内容,a[x][2]记录到目前的最长不下降子序列长度,a[x][3]记录前驱
6 int main()
7 {
8 scanf("%d",&n);
9 for(int i=1;i<=n;i++)
10 {
11 scanf("%d",&a[i][1]);
12 a[i][2]=1;
13 a[i][3]=0;
14 }
15 for(int i=n-1;i>=1;i--)//从后往前找
16 {
17 int l=0,k=0;
18 for(int j=i+1;j<=n;j++)
19 {
20 if(a[i][1]<=a[j][1]&&a[j][2]>l)//如果它后面的数比它大并且找一个长度最长的
21 {
22 l=a[j][2];
23 k=j;
24 }
25 if(l>0)
26 {
27 a[i][2]=l+1;//更新长度
28 a[i][3]=k;//记录前驱
29 }
30 }
31 }
32 int k=1;
33 for(int i=1;i<=n;i++)
34 if(a[i][2]>a[k][2])k=i;//找出长度最长的
35 cout<<a[k][2]<<endl;
36 while(k!=0)
37 {
38 cout<<a[k][1]<<" ";//输出最长子序列
39 k=a[k][3];
40 }
41 return 0;
42 }