动态规划-基础篇——最长上升子序列(nlogn)

原创 2014年01月24日 20:24:00
我写这片博文就只是提醒自己不要理解而已,其中只是一个结论,其实的证明,思路啥的都没写,以后搞dp专题的时候会全部补上,这里只是一个开头。



对于最长上升子序列(LIS)问题中,一直对lower_bound(),和upper_bound()分不清楚。

用法是:如果是严格LIS,则用的是lower_bound(),

如果是非严格LIS,则用的是upper_bound();


例如对于序列{3,4,4,5,4,4,4,4,4,4,6};

则严格Lis为{3,4,5,6},长度为4

而非严格LIS为{3,4,4,4,4,4,4,6}长度为8

代码如下
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=30000+5;
int b[maxn],a[maxn];
int LISdp(int n)
{
    int i,k;
    b[1]=a[1];
    for(i=2,k=1;i<=n;i++)
    {
        if(a[i]>=b[k])  b[++k]=a[i];
        else
        {
            int pos=upper_bound(b+1,b+1+k,a[i])-b;//非严格
            b[pos]=a[i];
        }
    }
    return k;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out2.txt","w",stdout);
    int n;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        int ans=LISdp(n);
        cout<<n-ans<<endl;
    }
    return 0;
}

相关文章推荐

NYOJ 17 单调递增最长子序列 (二分 STL,lower_bound)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abd...

最长上升子序列的两种算法

最长上升子序列英文全称:Longest Increasing Subsequence 一.O(n*n)算法,dp[i]表示以ai为末尾的最长上升子序列的长度,而以ai结尾的最长上升子序列有两种:1...

最长上升子序列(LIS)长度的O(nlogn)算法

hdu 1950 Bridging signals http://acm.hdu.edu.cn/showproblem.php?pid=1950 =========================...

动态规划---最长上升子序列问题(O(nlogn),O(n^2))

LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。 ****...

POJ 1631(最长上升子序列 nlogn).

~~~~ 由题意可知,因为左边是按1~n的顺序递增排列,要想得到不相交组合,左边后面的一定与相应右边后面的相连,如此一来, 就可以发现其实是一道最长上升子序列的题目,要注意的是N 题目链接:ht...

动态规划:最长上升子序列(二分算法 nlogn)

解题心得: 1、在数据量比较大的时候n^2会明显超时,所以可以使用nlogn 的算法,此算法少了双重循环,用的lower_bound(二分法)。 2、lis中的数字并没有意义,仅仅是找到最小点li...

nlogn的LIS(最长上升子序列)算法讲解

传统的LIS复杂度为O(n*n)每次都要寻找比当前点小的所有在它之前的点 O(nlogn)的则是每遍历到一个点,都将该点放在大于等于(大于也可以)该点value的第一个点的位置。更改该点的value而...

最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化

为了更好的介绍O(nlogn)算法,我们回顾一下一般的O(n^2)的算法。 令A[i]表示输入第i个元素,d[i]表示从A[1]到A[i]中以A[i]结尾的最长子序列长度。对于任意的0 DP状态...
  • Wall_F
  • Wall_F
  • 2012年12月14日 17:10
  • 15108

最长上升子序列nlogn算法

这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和...

最长上升子序列详解(nlogn)

最长不下降子序列的O(nlogn)算法分析如下: 设 A[t]表示序列中的第t个数,F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度,初始时设F [t] = 0(t = 1, 2, ....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划-基础篇——最长上升子序列(nlogn)
举报原因:
原因补充:

(最多只允许输入30个字)