求最长不下降序列
问题描述:
设有由n个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)<>b(j) (i<>j),若存在i1<i2<i3< … < ie 且有b(i1)<b(i2)< … <b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。
例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为7的不下降序列,同时也有7 ,9,16,18,19,21,22,63长度为8的不下降序列。
输入:13 7 9 16 38 24 37 18 44 19 21 22 63 15
输出: 8
7 9 16 18 19 21 22 63
1 #include<iostream> 2 using namespace std; 3 int pre[1001]; 4 int f[1001]; 5 int num[1001]; 6 int h,d,c,w=1; 7 int maxn=0; 8 void print (int a) 9 { 10 if(!pre[a])return ; 11 print(pre[a]); 12 cout<<num[a]<<" "; 13 } 14 int main() 15 { 16 while(cin>>num[++h]); 17 for(int i=1;i<=h;++i) 18 { 19 f[i]=1; 20 maxn=0; 21 for(int j=1;j<i;++j) 22 { 23 if(f[j]>maxn&&num[j]<num[i]) 24 { 25 maxn=f[j]; 26 f[i]=f[j]+1; 27 c=j; 28 } 29 } 30 pre[i]=c; 31 if(f[i]>d) 32 { 33 d=f[i]; 34 w=i; 35 } 36 } 37 cout<<d<<endl; 38 print(w); 39 return 0; 40 }