• 最长递增子序列


    #include <iostream>
    using namespace std;
    //int num[8]={0,0,3,1,2,4,1,5};//原始序列
    int num[8]={0,1,3,4,2,5,6,7};
    int d[8];//保存最长递增子序列的元素,第二种方法,复杂度低
    int dp[8];//第一种方法,复杂度高,dp[i]存储从num[1]到num[i]之间最长递增子序列的长度,num[i]一定在里边
    int BinSearch(int key,int i,int low,int high)//二分搜索,找到road[i]在d[]数组中的位置
    {
        int l=low,r=high;
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(num[i]<=d[mid])
                r=mid-1;
            else
                l=mid+1;
        }
        return l;
    }
    int LIS()
    {
        d[1]=num[1];
        int len=1;//最长递增子序列的元素个数
        int j;
        for(int i=2;i<=7;i++)
        {
            if(d[len]<num[i])
                j=++len;
            else
                j=BinSearch(num[i],i,1,len);
            d[j]=num[i];
        }
        return len;//d[]数组中保存的原始序列中的最长递增子序列的元素个数
    }
    
    /*int LIS(int num[],int n)
    {
        int ans=1;
        int m;
        dp[1]=1;
        for(int i=2;i<=n;i++)
        {
            m=0;
            for(int j=1;j<i;j++)
            {
                if(dp[j]>m&&num[j]<num[i])
                    m=dp[j];
            }
            dp[i]=m+1;
            if(dp[i]>ans)
                ans=dp[i];
        }
        return ans;
    }*/
    int main()
    {
        //第二种方法,复杂度低,二分搜索,可以保存最长递增子序列的元素
        int len=LIS();
        cout<<len<<endl;
        for(int i=1;i<=len;i++)
           cout<<d[i]<<endl;//输出原始序列中构成最长递增子序列的元素。*/
    
        //第一种方法,复杂度高,只能返回最长递增子序列的长度
        /*int len=LIS(num,7);
        cout<<len<<endl;
        for(int i=1;i<=7;i++)
            cout<<dp[i]<<endl;*/
        return 0;
    }
    

  • 相关阅读:
    NS3之路---NS3Tutorial解读---Introduction & Resource
    NS3之路---在NS3中添加openflow模块
    NS3之路---代码编辑器VIM
    2019.9.5绘图
    2019.9.4拖拽事件
    2019.9.3视频播放
    2019.08.30数组去重的几种方法以及所需时间对比
    2019.08.29定时器以及轮播图
    2019.08.27BOM的六个子对象(2)
    2019.08.27BOM的六个子对象(1)
  • 原文地址:https://www.cnblogs.com/vivider/p/3697697.html
Copyright © 2020-2023  润新知