DP模型:

d(i) 以第 i 个元素结尾的最长递增子序列的长度。

那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d(i)); 时间复杂度为 O(n*n);

下面介绍一个用二分优化的O(nlogn)的算法。

用一个数组g[i] 表示 d 值为 i 的数的最小的 a;即 最长递增子序列为 i 时,最小的 a 是多少。

显然 g[i]<=g[2]<=g[3];

计算d[i] : 需要找到 g中大于等于a[i] 的第一个数 j ,d[i] = j;

更新g :     g[j] = a[i] ;

使用STL的lower_bound可以直接求出比a[i] 大的第一个数,用的二分查找实现,总时间O(nlogn);

#include <bits/stdc++.h>
using namespace std; int a[];
int b[]; int main()
{ int n;
scanf("%d",&n); for(int i=;i<n;i++)
scanf("%d",&a[i]); int len = ;
b[] = a[]; for(int i=;i<n;i++) {
if(a[i]==b[len-])
continue;
if(a[i]>b[len-])
b[len++] = a[i];
else {
int pos = lower_bound(b,b+len,a[i])-b;
b[pos] = a[i];
}
} printf("%d\n",len);
return ;
}
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; #define maxn 1005
#define INF 0x3f3f3f3f int a[];
int g[]; int binary_search(int *s,int digit,int length) {
int left = ,right = length,mid;
while(right!=left) {
mid = (left+right)/;
if(digit==s[mid])
return mid;
else if(digit<s[mid])
right = mid;
else left = mid+;
}
return left;
} int main()
{
int n;
scanf("%d",&n); for(int i=;i<=n;i++) {
scanf("%d",&a[i]);
} memset(g,INF,sizeof(INF)); g[] = -;
int len = ;
int j;
for(int i=;i<=n;i++) {
j = binary_search(g,a[i],len); if(j==len)
len++;
g[j] = a[i];
} printf("%d\n",len-);
return ;
}

最长递增子序列LIS再谈的更多相关文章

  1. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  2. 动态规划(DP),最长递增子序列(LIS)

    题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...

  3. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  4. 一个数组求其最长递增子序列(LIS)

    一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...

  5. 算法之动态规划(最长递增子序列——LIS)

    最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...

  6. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  7. 算法面试题 之 最长递增子序列 LIS

    找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E ...

  8. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  9. POJ 1836 Alignment 最长递增子序列(LIS)的变形

    大致题意:给出一队士兵的身高,一开始不是按身高排序的.要求最少的人出列,使原序列的士兵的身高先递增后递减. 求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多. 1 2 3 4 ...

随机推荐

  1. iOS中model出来一个控制器的尺寸怎么设置?

    在xib的控制器里添加self.preferredContentSize = CGSizeMake( , ) 就能修改xib在界面上显示的大小- (void)viewDidLoad { [super ...

  2. Leetcode: Rotate Function

    Given an array of integers A and let n to be its length. Assume Bk to be an array obtained by rotati ...

  3. Python和Ruby开发中源文件中文注释乱码的解决方法(Eclipse和Aptana Studio3均适用)

    Eclipse的设置(Aptana Studio3与Eclipse基本完全相同,此处略) window->preferences->general->editors->text ...

  4. android中的权限(转)

    Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.p ...

  5. ScrollView属性总结

    结构 继承关系 public class ScrollView extends FrameLayout java.lang.Object android.view.View android.view. ...

  6. 03---Net基础加强

    多态---虚方法    (子类可以选择重写或者不重写) class Program { static void Main(string[] args) { Chinese cn1 = new Chin ...

  7. 夺命雷公狗TP下关联查询

    记录下我们常用的关联查询: public function add4(){ $id=$_GET['id']; $this->list = M("student")->t ...

  8. 使用Graham扫描法求二维凸包的一个程序

    #include <iostream> #include <cstring> #include <cstdlib> #include <cmath> # ...

  9. Selenium 新手入门(C#)1. 用vs运行调用Selenium打开页面

    Start步骤: 1.从http://docs.seleniumhq.org/download/ 下载 C# dll 文件和 Internet Explorer Driver Server(32 或 ...

  10. spring支持的websocket

    首发:个人博客 必须说明:这篇博文只用于自己记录,使用spring的websocket支持一定要看官方文档,权威又简明,不推荐看不专业又啰嗦的国产博文. 已尝试了两种方法,当然,不管哪种方法都要先添加 ...