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. G面经prepare: Pattern Match

    设定一个pattern 把 'internationalization' 变成 'i18n', 比如word是house,pattern可以是h3e, 3se, 5, 1o1s1等, 给pattern ...

  2. PNG图片去除额外透明区域

    bitmapdata.getColorBoundsRect(0xFF000000,0x00000000,false) http://www.cnblogs.com/shinings/archive/2 ...

  3. html 鼠标移入标签 显示小手指

    <div style="width: 200px; height: 200px; background: red; cursor: pointer;"></div ...

  4. SQL 2012 连接失败

  5. SQL 面向对象

    1.面向过程 int a = 10;int b =5;int c = a+b; int r1 = 10;int r2 = 5;double c = r1*r1*3.14 - r2*r2*3.14 缺点 ...

  6. hdu5255 魔法因子

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5255 首先先预处理出一个p,使得p*因子X等于一个整数,且p最小,设q=p*X. 则题目则可以看成存在 ...

  7. 外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )

    转帖: http://www.oschina.net/question/565065_115196?sort=time 实验目的: mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方 ...

  8. paper 10:支持向量机系列七:Kernel II —— 核方法的一些理论补充,关于 Reproducing Kernel Hilbert Space 和 Representer Theorem 的简介。

    在之前我们介绍了如何用 Kernel 方法来将线性 SVM 进行推广以使其能够处理非线性的情况,那里用到的方法就是通过一个非线性映射 ϕ(⋅) 将原始数据进行映射,使得原来的非线性问题在映射之后的空间 ...

  9. 基于fullpage的幻灯片播放

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8&quo ...

  10. 好用的调色软件 ColorSchemer Studio

    软件名叫:ColorSchemer Studio 这是windows平台下的软件