zoukankan      html  css  js  c++  java
  • 最长不下降子序列

    设有由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;
    }
  • 相关阅读:
    命令行工具--netstat
    Man手册--nmap
    bc -l 对于 %取模计算出错
    离散对数和原根 欧拉定理证明
    bc-win32-power-echo-vim-not-work
    2010版EXCEL下方sheet工作表隐藏了
    word多出空标题,样式是列出段落
    plantuml
    久石让《龙猫》豆豆龙 钢琴视奏版
    神奇校车 = topsage
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2635266.html
Copyright © 2011-2022 走看看