最长不下降子序列

最长不下降子序列解法

第一种就是普通的dp方法

for(int i=1;i<=n;i++){
        cin>>a[i];
       // dp[i]=1;
    }
  //  dp[0]=-1;
    for(int i=1;i<=n;i++){
d[i] = 1;
        for(int j=1;j<i;j++){
            if(a[i]>=a[j]) dp[i]=max(dp[i],dp[j]+1);
        }
        ans=max(ans,dp[i]);
    }
    cout<<ans;

主要记录一下n logn的写法(二分)

主要思路: 用一个数组 b 来记录最长的子序列;  一开始让b[ 1 ]=a[ 1 ] (数组a为输入的一个序列) ,从i=2开始循环,如果a[ i ] 大于了当前的这个 b 数组的末尾元素,直接让b在后面加上这个a[ i ]即可,如果不大于,那么查找b数组的元素,找到第一个大于a[ i ]的那个元素,让a[ i ]顶替它,此后一直这样维护数组b,最后b的长度就是最长不下降子序列的长度;

//用数组b来记录这个最长的子序列
//a是输入的序列
b[1]=a[1]; 
len =1;
    for (i=2;i<=n;++i)
    {
        if (a[i]>=b[len])   //如果a[i]大于b的末尾元素直接在b后面加上a[i]
            b[++len]=a[i];
        else
        {
            t=upper_bound( b+1 , b+len+1 , a[i] )-b; //寻找b数组中第一个大于a[i]的下标
            b[t]=a[i];
        }
    }
//最后len的长度即为最长的子序列长度

 

发布了158 篇原创文章 · 获赞 20 · 访问量 10万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览