题目描述:

LIS问题(longest increasing subsequence),即:最长上升子序列问题,是动态规划中一个比较经典的问题。具体描述为:一个有n个整数的序列:A[1],A[2],…,A[n],求出该序列中最长上升子序列的长度。例如:5,3,4,8,它的上升子序列有:
5
3
4
8
3 4
3 8
4 8
3 4 8
最长的上升子序列的长度为3

输入:

共2行
第1行:n(表示序列的长度 1 <= n < 10000)
第2行:n个用空格隔开的整数(0 <= 每个整数 <= 108)

输出:

最长上升子序列的长度
 样例输入:
6
5 3 4 8 6 7

 样例输出:

4

 思路(n log n 做法):

首先,我们就要改变dp数组的含义

dp[i]:数列长度为2的LIS结尾最小的数。

e.g. dp[2] = 3(本身) ,dp[3] = 4。(样例)

我们就可以遍历每一个a[i],找到第一个比它大(不是大于等于!!!)的dp数,并将这个dp末尾最小的数更新为a[i],如果更新完后长度大于目前LIS的最长长度,就更新长度。(核心部分,用二分lower_bound


 代~~码~~:

#include <bits/stdc++.h>
using namespace std;
#define INF INT_MAX//正无穷
#define XINF INT_MIN//负无穷 int dp[10005],a[10005];
int n; int main(){
scanf("%d",&n); for (int i = 1;i <= n;i++){
scanf("%d",&a[i]);
dp[i] = INF;
}//输入,将dp值赋为正无穷 dp[0] = XINF;//将dp[0]赋为负无穷
int len = 0;//LIS长度,即最后答案 for (int i = 1;i <= n;i++){//遍历a数组
int zb = lower_bound(dp,dp + len + 1,a[i]) - dp;
//找到第一个大于它的数(二分)
if(zb > len){//如果其长度大于答案长度
len++;//更新
}
dp[zb] = a[i];//将dp数组末尾最小的数改为a[i]
} printf("%d",len);//输出
return 0;
}

1269: 求最长上升子序列(LIS)的更多相关文章

  1. nlogn 求最长上升子序列 LIS

    最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]& ...

  2. 求最长上升子序列(Lis模板)

    实现过程 定义已知序列数组为dp[]:dp[1…8]=389,207,155,300,299,170,158,65 我们定义一个序列B,然后令 i = 1 to 8 逐个考察这个序列.此外,我们用一个 ...

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

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

  4. SPOJ 3937 - Wooden Sticks 最长上升子序列LIS

    给了n个(n<=5000)木棍的长度hi与宽度wi(均小于10000),现在机器要打磨这些木棍,如果相邻连个木棍hi<=hj并且wi<=wj就不需要调整机器,问如何排序使得机器调整的 ...

  5. SGU 199 - Beautiful People 最长上升子序列LIS

    要邀请n个人参加party,每个人有力量值strength Si和魅力值 beauty Bi,如果存在两人S i ≤ S j and B i ≥ B j 或者  S i ≥ S j and B i ≤ ...

  6. C++ 求最长递增子序列(动态规划)

    i 0 1 2 3 4 5 6 7 8 a[i] 1 4 7 2 5 8 3 6 9 lis[i] 1 2 3 2 3 4 3 4 5 时间复杂度为n^2的算法: //求最长递增子序列 //2019/ ...

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

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

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

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

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

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

随机推荐

  1. 浅尝Spring注解开发_Servlet3.0与SpringMVC

    浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...

  2. Java学习笔记-基础语法ⅩⅠ-UDP、TCP

    网络编程 三要素:IP地址.端口.协议 IP地址:使用ipconfig查看,如果装了VM的话,会有VMnet1.VMnet8和WLAN,net1不能从虚拟机到主机,net8不能从主机到虚拟机,net0 ...

  3. 896.Montonic Array - LeetCode

    Question 896. Monotonic Array Solution 题目大意: 类似于数学中的减函数,增函数和物理中的加速度为正或为负 思路: 先比较前两个是大于0还是小于0,如果等于0就比 ...

  4. 以圆类 Circle 及立体图形类 Solid 为基础设计球类 Sphere

    学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计球类 Sphere 代码示例: package 实验三; import java.util.Scanner; class Point ...

  5. python文件操作拓展与认识函数

    目录 文件内光标的移动(了解即可) 前言 控制光标移动seek()方法 文件的修改 函数 语法结构 简单的使用 作业 答案 文件内光标的移动(了解即可) 前言 在文件的内置方法中,read()方法是可 ...

  6. 魔改了一下bootstrap-treeview组件,发布个NPM包体验一下

    前言 之前在这篇文章 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 中说到,我为了让文章分类列表支持层级结构,用了一个树形组件,不过这个组件太老了,使用的Boots ...

  7. 数据库常用DDL语句

    一.创建表 CREATE TABLE TABLE_NAME( #create table 表名 ID INT(4) PRIMARY KEY, #字段名 数据类型 完整性约束条件 NAME VARCHA ...

  8. SAP FICO 常用table

    Table 描 述 "Table Type" "Application Class" "Data Class" Description &q ...

  9. UiPath视频教程

    UiPath机器人企业框架简介https://www.bilibili.com/video/BV1SK411L7u9 UiPath借助第三方Pdf软件工作https://www.bilibili.co ...

  10. bat-设置oracle服务

    1.停止oracle所有服务 并将服务设置为手动启动 @echo off echo oracle服务--------停止 net stop OracleVssWriterORCL net stop O ...