一、简单的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;
           }

最长不下降子序列的O(n^2)算法和O(nlogn)算法的更多相关文章

  1. 最长不下降子序列(LIS)

    最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i ...

  2. 最长不下降子序列 O(nlogn) || 记忆化搜索

    #include<stdio.h> ] , temp[] ; int n , top ; int binary_search (int x) { ; int last = top ; in ...

  3. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...

  4. 最长不下降子序列//序列dp

    最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...

  5. 【tyvj】P1049 最长不下降子序列

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...

  6. hdu 4604 Deque(最长不下降子序列)

    从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后 ...

  7. 最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

  8. SPOJ 4053 - Card Sorting 最长不下降子序列

    我们的男主现在手中有n*c张牌,其中有c(<=4)种颜色,每种颜色有n(<=100)张,现在他要排序,首先把相同的颜色的牌放在一起,颜色相同的按照序号从小到大排序.现在他想要让牌的移动次数 ...

  9. SPOJ 3943 - Nested Dolls 最长不下降子序列LIS(二分写法)

    现在n(<=20000)个俄罗斯套娃,每个都有宽度wi和高度hi(均小于10000),要求w1<w2并且h1<h2的时候才可以合并,问最少能剩几个. [LIS]乍一看跟[这题]类似, ...

随机推荐

  1. Qt之控件美化

    级联样式表 (CSS) 包含应用于网页中的元素的样式规则.CSS 样式定义元素的显示方式以及元素在页中的放置位置.可以创建一个通用规则,只要 Web 浏览器遇到一个元素实例,或遇到一个分配给某个特定样 ...

  2. git——学习笔记(二)远程仓库

    GIT杀手锏之一——远程仓库 拥有远程仓库的两个办法 1:搭一个Git服务器  2:在GitHub上免费托管的Git仓库 本地仓库   远程仓库 一.在GitHub上免费托管的Git仓库 电脑: 1. ...

  3. MongoDB 查询 (转) 仅限于C++开发

    1.find MongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数 决定了要返回哪些文档.其形式也是一个文档,说明要查询的细节 ...

  4. 摘自:java夜未眠之java学习之道

    目前Java可以说是产业界和学术界最热门的语言,许多读者都很急切想把Java学好.除非是武侠小说中的运功传送内力的方式,否则花上一段时间苦学是免不了的.花时间,不打紧,就是怕方法错误,事倍功半.我认为 ...

  5. Cisco路由器的6种模式

    Cisco路由器的6种模式 -------------------------------------------------------------------------------------- ...

  6. swift简介

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  7. UIkit框架之UItextfield

    1.继承链:UIcontrol:UIview:UIresponder:NSObject 2.成为第一响应者:[text becomeFirstResponder];  //让该文本成为第一响应者 3. ...

  8. @synthesize的使用

    利用@synthesize可以给在.m文件中给.h文件中的属性重新定义新的名称如 @synthesize firstname = anothername:firstname是在.h文件中定义的,新定义 ...

  9. .NET的语法优化

    1.多参数 判断 条件 //判断 var fileKey = new { DateStart = search.DateStart.IsNull(), //关开始时间 DateEnd = search ...

  10. 使用免费内测托管平台fir.im测试

    1,使用Xcode先行把项目导成ipa文件.登录http://fir.im/ 2.点击左上角的苹果标志,把准备好的ipa文件拖入即可.4.填写相关材料即可开始上传5,让飞机灰一会即可.6.接着会看见: ...