题目描述

给定一个数列,包含N个整数,求这个序列的最长上升子序列。

例如 2 5 3 4 1 7 6 最长上升子序列为 4.

1.O(n2)算法解析

看到这个题,大家的直觉肯定都是要用动态规划来做,那么我们先设立一个数组。

设d[ i ]为以a[ i ]为结尾的最大子序列的长度

有了这个后,我们可以很容易的写出状态转移方程:

d[ i ] = max(d[ i ] , d[ j ] + 1) 若 j < i 且 a[ i ] > a[ j ]

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000
int d[N];//表示以a[i]结尾的最大长度
int a[N];
int main() {
for (int i = 0; i < 7; i++) {
cin >> a[i];
}
d[0] = 1;
for (int i = 1; i < 7; i++) {
d[i] = 1;
for (int j = 0; j < i; j++) {
if (a[i] > a[j])
d[i] = max(d[j] + 1, d[i]);
}
}
int maxt = -1;
for (int i = 0; i < 7; i++) {
maxt = max(d[i], maxt);
}
cout << maxt << endl;
return 0;
}

2.O(ologn)算法解析

首先我们给数组d换一种含义,设d[ i ] 为 长度为 i 的子序列的最后一个元素的值。

我们要做的就是,依次把每一个元素插到他合适的位置上去。

例如现在的数组d为

这时我们要处理一个元素,假设值为5,那我们应该放到哪里?

这里面长度为2的子序列最后一个长度为4,5>4,因此我们可以把5放到d[3]中。

但是把6换成5有什么意义呢?

显然,序列元素有限的情况下,子序列的末尾元素越小,越有利于我们向后添加元素(增大其长度)。

这句话就是解决问题的关键。

因此,处理每一个元素的时候,我们只需要把元素填入第一个大于这个元素值的d[ i ]中就好。

通过简单的分析,我们很容易知道数组d是个递增的数组,因此解决上面这个问题,我们采用二分查找,写一个find()函数,返回第一个大于该元素值 t 的数组d元素的下标。

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000
int d[N];
int a[N];
int find(int l, int r, int x) {//寻找数组d中第一个大于x的元素的下标
while (l <= r) {
int mid = (l + r) / 2;
if (d[mid] < x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return l;
}
int main() {
for (int i = 0; i < 7; i++) {
cin >> a[i];
}
d[0] = -0x3f3f3f3f;
int len = 1;
for (int i = 1; i < 7; i++) {
if (a[i] > d[len]) {
d[++len] = a[i];
}
else {
int k = find(1, len, a[i]);
d[k] = a[i];
}
}
cout << len;
return 0;
}

最长上升子序列(LIS)n2 nlogn算法解析的更多相关文章

  1. 最长上升子序列LIS(51nod1134)

    1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递 ...

  2. lrj 9.4.1 最长上升子序列 LIS

    p275 d(i)是以Ai为结尾的最长上升子序列的长度 <算法竞赛入门经典-训练指南>p62 问题6 提供了一种优化到 O(nlogn)的方法. 文本中用g(i)表示d值为i的最小状态编号 ...

  3. 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】

    二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...

  4. 题解 最长上升子序列 LIS

    最长上升子序列 LIS Description 给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的 ...

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

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

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

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

  7. 浅谈最长上升子序列(O(n*logn)算法)

    今天GM讲了最长上升子序列的logn*n算法,但没讲思路... 我看了篇博客,发现-- 说的有道理!!! 首先,举例子: a[7]={1,2,4,3,6,7,5}(假设以1开头) 很明显,LIS=5: ...

  8. 2.16 最长递增子序列 LIS

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

  9. LCS(最长公共子序列)动规算法正确性证明

    今天在看代码源文件求diff的原理的时候看到了LCS算法.这个算法应该不陌生,动规的经典算法.具体算法做啥了我就不说了,不知道的可以直接看<算法导论>动态规划那一章.既然看到了就想回忆下, ...

随机推荐

  1. Git提交撤销

    场景:本地修改代码后,执行commit提交,但此时想撤销该提交. 执行命令: git reflog   查看所有commit历史 git reset --hard commitid     将当前远程 ...

  2. python常见容器属性和方法

    `````字符串中反斜杠字符表 转义格式    意义 \'  单引号(') \"  双引号(") \\  反斜杠(\ ) \n  换行 \r  返回光标至行首 \f  换页 \t ...

  3. 【热更新IK词典】ElasticSearch IK 自动热更新原理与实现

    一.热更新原理 elasticsearch开启加载外部词典功功能后,会每60s间隔进行刷新字典.具体原理代码如下所示: public void loadDic(HttpServletRequest r ...

  4. Bitmap 位图

    转自: http://dongxicheng.org/structure/bitmap/ 1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现 ...

  5. QtWebKit_cookie

    1.百度搜索“qtwebkit cookie” 2. 2.1.qtwebkit 里 cookie 信息的保存 http://blog.tianya.cn/post-227188-33378112-1. ...

  6. 用训练好的caffemodel来进行分类

    caffe程序自带有一张小猫图片,存放路径为caffe根目录下的 examples/images/cat.jpg, 如果我们想用一个训练好的caffemodel来对这张图片进行分类,那该怎么办呢? 如 ...

  7. Spring之核心容器bean

    摘要:Spring的核心容器实现了Ioc,其目 的是提供一种无侵入式的框架.在本文中,首先讲解了Spring的基础bean的相关知识,然后介绍了Spring是如何对bean进行管理的. 在Spring ...

  8. 【Jmeter】配置不同业务请求比例,应对综合场景压测

    背景 在进行综合场景压测时,遇到了如何实现不同的请求所占比例不同的问题. 有人说将这些请求分别放到单独的线程组下,然后将线程组的线程数按照比例进行配置. 这种方法不是很好,因为服务器对不同的请求处理能 ...

  9. 雷林鹏分享:Ruby 面向对象

    Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象 ...

  10. JavaScript学习总结(二十二)——JavaScript屏蔽Backspace键

    今天在IE浏览器下发现,当把使用readonly="readonly"属性将文本框设置成只读<input type="text" readonly=&qu ...