题目连接

https://www.acwing.com/problem/content/description/898/

思路

我们用一个f[i]f[i]f[i]表示以长度为i结尾的子序列的最小值的大小,那么不难发现我们这个f数组是一个单调递增的序列,那么我们就能对我们往前匹配的过程做一个二分优化,也就是找到长度尽量大的且比当前a[i]a[i]a[i]值小的一个位置,如果我们发现当前的这个a[i]a[i]a[i]是比之前所有的元素都要大的,那么我们就应该让我们的最长序列的长度增加,并将a[i]a[i]a[i]放在末尾,表示长度为lenlenlen子序列的末尾最小值,否则的话我们就去更新之前长度的末尾最小值,因为如果一个人比你小还在你后面,那你也没存在的必要了

代码

代码版本一

#include<bits/stdc++.h>
using namespace std;const int N = 1e5+10;
int a[N],n,f[N];int LIS(){f[1] = a[1];int len = 1;for(int i = 2;i <= n; ++i)if(a[i] > f[len]) f[++len] = a[i];elsef[lower_bound(f + 1,f+len+1,a[i]) - f] = a[i];return len;
}int main()
{cin>>n;for(int i = 1;i <= n; ++i) cin>>a[i];f[1] = a[1];cout<<LIS()<<endl;return 0;
}

模板代码

#include<bits/stdc++.h>
using namespace std;const int N = 1e5+10;
int n;template<typename T>
int LIS(vector<T> a) {vector<T> dp;for(auto x : a) {auto it = lower_bound(dp.begin(), dp.end(), x);if(it == dp.end()) dp.push_back(x);else *it = x;}return dp.size();
}int main()
{cin>>n;vector<int> a(n);for(int i = 0;i < n; ++i) cin>>a[i];cout<<LIS(a)<<endl;return 0;
}

AcWing 896. 最长上升子序列 II(二分优化LIS)相关推荐

  1. (贪心+最长上升子序列) acwing 896. 最长上升子序列 II

    896. 最长上升子序列 II 题目链接https://www.acwing.com/problem/content/898/ 题目: 思路:在队列里求出小于t的最大的一个数的下标.a[0]初始化最小 ...

  2. 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)

    题干: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  3. 优化 最长上升子序列_LIS - 最长上升子序列 (二分优化)

    题目: 长度为n的序列a1, a2, ..., an,选出满足 j < i 时, a[j] < a[i] 最长子序列 分析: 当选择第i个时候,在j 状态:dp[i]表示以i为终点的最大上 ...

  4. 【POJ - 2533】Longest Ordered Subsequence(四种方法解决最长上升子序列 含二分优化版本)

    题干: Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Accepted: 18453 Description ...

  5. 896. 最长上升子序列 II

    给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数 NN. 第二行包含 NN 个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 ...

  6. LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个由整数数组组成的数组arrays,其中arrays[i]是严格递增排序的,返回一个表示所有数组之间的最长公共子序列的整数数组. 子序列是从另一个序 ...

  7. AcWing 897. 最长公共子序列(LCS朴素版)

    题目连接 https://www.acwing.com/problem/content/899/ 思路 我们定义f[i][j]f[i][j]f[i][j]表示的是a串中长度为i和b串长度为j的最长公共 ...

  8. AcWing 895. 最长上升子序列(LIS朴素做法)

    题目连接 https://www.acwing.com/problem/content/897/ 思路 因为数据范围很小,所以我们定义f[i]f[i]f[i]表示的是以第i个元素结尾的最长上升子序列的 ...

  9. ACwing 895 - 最长上升子序列(最长上升子序列模型)

    给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 1 ≤ N ≤ ...

最新文章

  1. 麒麟处理器是基于arm的吗_麒麟芯片是基于ARM构架,如果得不到授权华为还能活吗?...
  2. 11、Kubernetes集群安全机制
  3. Python的 is 和 == 弄懂了吗?
  4. Google Dremel 原理 - 如何能3秒分析1PB
  5. 水印铺满_一张人民币水印纸的“争气”之路
  6. mysql数据库切换
  7. Java 异常处理机制
  8. python vs golang_Ruby vs Golang:四个维度对比,谁更胜一筹?
  9. 为什么promise就是微队列?setTimeOut就是宏队列?
  10. 普通人赚大钱,做好这一点,才是真正的捷径
  11. Vue学习之路---No.1(分享心得,欢迎批评指正)
  12. 集群服务器分布式iis_使用nginx实现分布式限流的方法
  13. 单源最短路(spfa+Dijkstra)附数据
  14. 全新APP软件游戏应用网站源码+支持WAP/Pbootcms内核
  15. matlab2018历史命令在哪,2018美赛准备之路——Matlab基础——命令行功能函数
  16. Docker------网络
  17. IT常用职位缩写总结
  18. qq邮箱怎么发送html文件在哪里,QQ邮箱怎么发送文件夹
  19. iNode 校园网登录一直处于“获取 IP 地址”状态
  20. php期末作业作业,作业作业作业作业作业作业

热门文章

  1. Python使用XGBoost
  2. 批标准化 tf.keras.layers.BatchNormalization 参数解析与应用分析
  3. python 内置函数:iter()
  4. SOA架构设计和相关案例分析
  5. 2019春第十二周作业Compile Summarize
  6. java----数组
  7. Android和H5交互-基础篇
  8. r语言之散点图类型type参数
  9. Ruby之旅(16) 异常处理 rescue与ensure
  10. pcre的compile,exec和free的代码