求最长不下降子序列
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 }