设有由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]往前算的算法:

最长不下降子序列_#include最长不下降子序列_ios_02View 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]往后算的算法:

最长不下降子序列_#include最长不下降子序列_ios_02View 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;
}