转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法

最长不下降子序列(LIS:Longest Increasing Subsequence)

//用句通俗的话说,我讲的很通俗易懂~~

问题描述:给出n个数,求出其最长不下降子序列的长度,比如n=5,5个数是{4,6,5,7,3};其最长下降子序列就是{4,6,7},长度为3。

一、简单的O(n^2)的算法

很容易想到用动态规划做。设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i>j。然后在lis[]中找到最大的一个值,时间复杂度是O(n^2)。

代码实现:

int Longest_Increasing(int num[],int n){

int lis[n],i,j;

for(i=0;i<n;i++){

lis[i]=1;

for(j=0;j<i;j++)

if(num[i]>num[j]&&lis[j]+1>lis[i])

lis[i]=lis[j]+1;

}

int maxn=0;

for(i=0;i<n;i++) if(maxn<lis[i]) maxn=lis[i];

return maxn;

}

二、复杂点的O(nlogn)算法

概述:O(nlogn)的算法关键是它建立了一个数组b[],b[i]表示长度为i的不下降序列中结尾元素的最小值,用K表示数组目前的长度,算法完成后K的值即为最长不下降子序列的长度。

具体点来讲:

设当前的以求出的长度为K,则判断a[i]和b[k]:

1.如果a[i]>=b[k],即a[i]大于长度为K的序列中的最后一个元素,这样就可以使序列的长度增加1,即K=K+1,然后现在的b[k]=a[i];

2.如果a[i]<b[k],那么就在b[1]...b[k]中找到最大的j,使得b[j]<a[i],然后因为b[j]<a[i],所以a[i]大于长度为j的序列的最后一个元素,那么就可以更新长度为j+1的序列的最后一个元素,即b[j+1]=a[i]。

算法复杂度的分析:

因为共有n个元素要进行计算;每次计算又要查找n次,所以复杂度是O(n^2),但是,注意到b[]数组里的元素的单调递增的,所以我们可以用二分法,查找变成了logn次。这样算法的复杂度就变成了O(nlogn)。具体算法实现请看代码(7-13update:以前的blog用不了了,所以重新弄过了)。

下面这段代码解决的是一道OI的题。

http://www.rqnoj.cn/Problem_Show.asp?PID=167

#include<iostream>
            using namespace std;
            long f[100001]={0},l=1,r,m,t=0,a;
            inline void BinarySearch(){
                     while(l<=r){
                           m=(l+r)>>1;
                           if(f[m]==a){l=m;return;}
                           else
                                  if(f[m]>a)l=m+1;
                                 else r=m-1;
                     }
             }
             main(){
                       long n;
                       cin>>n;
                       for(int i=1;i<=n;i++){
                            cin>>a;
                            if(a==0)continue;
                            l=1,r=t;
                            BinarySearch();
          if(l<=t)f[l]=a;
                            else t++,f[t]=a;
                       }
   cout<<t;
           }

//若仍然不能深刻理解可参考http://blog.sina.com.cn/s/reader_4ec7d3fc01000aet.html或跟我讨论

最长不下降子序列的O(n^2)算法和O(nlogn)算法相关推荐

  1. 最长不下降子序列(推广问题)

    最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...

  2. 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)

    题目链接 最多不相交路径 这种问题变化比较多,但都能表示成以下形式: 已知一些路径,每个节点只能属于一条路径,求能选择多少条路径使它们不相交. 主要的方法是拆点,将一个点拆成两个,然后连边,容量表示该 ...

  3. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  4. 【P2766】 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  5. 洛谷2766:[网络流24题]最长不下降子序列问题——题解

    https://www.luogu.org/problemnew/show/P2766 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出 ...

  6. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...

  7. 洛谷 - P2766 最长不下降子序列问题(最大流+动态规划+思维建边)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,有三个子问题: 求出当前数列的最长不下降子序列的长度len 如果每个数最多只能使用一次,问最多可以组成多少个长度为len的最长不下降子序列 如 ...

  8. 中石油训练赛 - Racing Gems(最长不下降子序列)

    题目描述 You  are  playing  a  racing  game.  Your  character  starts  at  the  X-axis  line  (y=0)  and ...

  9. HDU - 1160 FatMouse's Speed(最长不下降子序列)

    题目链接:点击查看 题目大意:给出许多二元组(W,S),最后要求输出最长的满足W严格递增,S严格递减的子序列长度,以及方案,输出任意一种即可 题目分析:看起来像二维偏序,其实对任意一维排序后求最长不下 ...

最新文章

  1. 服务器根目录文件配置文件,在文档根目录中存储安装和配置文件
  2. 开源大数据周刊-第49期
  3. NodeAsp——像开发NodeJS应用一样玩转ASP
  4. CPU profiling
  5. leetcode19. 删除链表的倒数第N个节点
  6. 华为首款可折叠屏5G手机今日开售;GitHub将开源代码保存在北极;Win10禁用WEP加密|极客头条...
  7. Xib和StoryBoard的区别
  8. 系统学习NLP(九)--中文分词算法综述
  9. Post传值时间特殊字符处理比如 p/p当作参数传递到后台
  10. SVN客户端的使用方法
  11. 手把手教你在树莓派上搭建ghost个人博客呦
  12. Chrome谷歌浏览器Flash Player被屏蔽如何解决
  13. 怎么比对两个html列表,两个表格对比,如何快速找出不同数据!
  14. ADF用户页面行为监控
  15. 如何读取蓝牙linkkeys值
  16. ffmpeg转换视频内存溢出的问题
  17. JDBC使用教程详解
  18. 一女孩写的(女人反省,男人感动。。。)
  19. 你怎样看待男女军人接吻
  20. 升级到 iOS 16 后掉电快?更新后手机发热怎么办?

热门文章

  1. 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements )
  2. docker进阶篇(一) ---- Volume(数据卷)
  3. JavaSript模块规范 - AMD规范与CMD规范介绍[转]
  4. 关于椭圆的积分变量替换
  5. Android JNI 传递对象
  6. Agent Job相关的系统表
  7. Apache地址重写的几个问题
  8. 汇编语言随笔(9)-实验11(用条件转移指令来编写子程序)
  9. Mac下使用ABTestingGateway快速搭建灰度网关
  10. 新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》