动态规划-基础篇——最长上升子序列(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;
}

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

LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。 ****...
  • zhangyx_Xyz
  • zhangyx_Xyz
  • 2016年03月21日 20:32
  • 5474

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

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

动态规划——最长上升子序列

最长上升子序列(Longest increasing subsequence) 问题描述         对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足...
  • code_pang
  • code_pang
  • 2013年04月03日 20:07
  • 7219

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

LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。 *******...
  • z_Y_x_ac
  • z_Y_x_ac
  • 2015年02月20日 19:42
  • 244

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

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

杭电ACM OJ 1025 Constructing Roads In JGShining's Kingdom 最长上升子序列 O(nlogn)算法详解+回溯暴力解决+动态规划dp优雅解决

Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 6...
  • qq_36523667
  • qq_36523667
  • 2017年11月25日 16:53
  • 60

最长递增子序列的求解(O(n*n),O(nlogn))——动态规划

该问题均使用动态规划来解决 1.在O(n*n)的复杂度下求解最长递增子序列 1) 描述最优子结构 序列中每个元素维护两个额外信息量,均假设当前元素(i)是 (0~i-1)个元素子序列中作为递增子序列的...
  • Virtual_Func
  • Virtual_Func
  • 2016年03月17日 11:55
  • 375

YTU OJ 3135: 动态规划基础题目之最长上升子序列(Java解题)

Description 一个数的序列bi,当b1 b2 < ... bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子...
  • mcp3128
  • mcp3128
  • 2017年11月18日 14:22
  • 44

动态规划2-最长上升子序列(算法基础 第5周)

最长上升子序列问题描述: 源码:#include #include #include using namespace std;const int MAXN=1010; int a...
  • NNNNNNNNNNNNY
  • NNNNNNNNNNNNY
  • 2016年06月09日 23:14
  • 581

动态规划——最长上升子序列问题

介绍 最长上升子序列问题,也就是Longest increasing subsequence,缩写为LIS。是指在一个序列中求长度最长的一个上升子序列的问题,是动态规划中一个相当经典问题。在这里我们可...
  • u011523762
  • u011523762
  • 2016年07月31日 21:00
  • 177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划-基础篇——最长上升子序列(nlogn)
举报原因:
原因补充:

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