设有由n个不相等的整数组成的数列,记为:
a(1),a(2),....,a(n)且a(i)!=a(j) (i!=j)
若存在i1,i2,i3,....,ik 且有a(i1)<a(i2)<...<a(ik),则称为长度为k的不下降序列。
如 3,18,7,14,10,12,23,41,16,24
则它的最长子序列为 3,7,10,12,16,24或3,7,10,12,23,41都是长度为6的最长不下降序列
以下是从a[n]往前算的算法:
View Code
View Code #include<iostream> using namespace std; int main(){ int maxn=100; int a[maxn], b[maxn],//存储i位置元素的最长子序列数 c[maxn];//存储i位置的元素子序列的后缀 int n,max,p; cout<<"n:"; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; b[i]=1; c[i]=0; } for(int i=n-1;i>=1;i--){ max=0; p=0; for(int j=i+1;j<=n;j++){ if(a[i]<a[j]&&b[j]>max){ max=b[j];//找到大于a[i]且b[]是最大的元素 p=j;//记下这个元素的位置,以便把b[j]+1赋值给b[i] } } if(p!=0){ b[i]=b[p]+1; c[i] =p; } } max=0; p=0; for(int i=1;i<=n;i++){ if(b[i]>max){ max=b[i]; p=i; } } cout<<"The maxlong is :"<<max<<endl; cout<<"The result is :"<<endl; while(p!=0){ cout<<a[p]<<" "; p=c[p]; } return 0; }
以下是从a[1]往后算的算法:
View Code
#include<iostream> using namespace std; int main(){ int maxn=100, a[maxn], b[maxn],//存储i位置上的元素所在的子序列的最长序列数 c[maxn];//存储i位置上的元素所在子序列的前一个 int n,max,p; cout<<"Please Input the number of subsequence n:"; cin>>n; cout<<"Now input the elements :"<<endl; for(int i=1;i<=n;i++){ cin>>a[i]; b[i]=1; c[i]=0; } for(int i=1;i<=n;i++){ max=0; p=0; for(int j=i-1;j>0;j--){ if(a[j]<a[i]&&b[j]>max){ max=b[j]; p=j; } } if(p!=0){ b[i]=b[p]+1; c[i]=p; } } max=0; p=0; for(int i=n;i>0;i--){ if(b[i]>max){ max=b[i]; p=i; } } cout<<"The maxlong is:"<<max<<endl; int aa[maxn]; int k=max; while(p!=0){ //cout<<a[p]<<" "; aa[k]=a[p]; p=c[p]; k--; } for(int j=1;j<=max;j++){ cout<<aa[j]<<" "; } return 0; }