AcWing 896. 最长上升子序列 II(二分优化LIS)
题目连接
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)相关推荐
- (贪心+最长上升子序列) acwing 896. 最长上升子序列 II
896. 最长上升子序列 II 题目链接https://www.acwing.com/problem/content/898/ 题目: 思路:在队列里求出小于t的最大的一个数的下标.a[0]初始化最小 ...
- 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)
题干: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- 优化 最长上升子序列_LIS - 最长上升子序列 (二分优化)
题目: 长度为n的序列a1, a2, ..., an,选出满足 j < i 时, a[j] < a[i] 最长子序列 分析: 当选择第i个时候,在j 状态:dp[i]表示以i为终点的最大上 ...
- 【POJ - 2533】Longest Ordered Subsequence(四种方法解决最长上升子序列 含二分优化版本)
题干: Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 41944 Accepted: 18453 Description ...
- 896. 最长上升子序列 II
给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数 NN. 第二行包含 NN 个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 ...
- LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个由整数数组组成的数组arrays,其中arrays[i]是严格递增排序的,返回一个表示所有数组之间的最长公共子序列的整数数组. 子序列是从另一个序 ...
- AcWing 897. 最长公共子序列(LCS朴素版)
题目连接 https://www.acwing.com/problem/content/899/ 思路 我们定义f[i][j]f[i][j]f[i][j]表示的是a串中长度为i和b串长度为j的最长公共 ...
- AcWing 895. 最长上升子序列(LIS朴素做法)
题目连接 https://www.acwing.com/problem/content/897/ 思路 因为数据范围很小,所以我们定义f[i]f[i]f[i]表示的是以第i个元素结尾的最长上升子序列的 ...
- ACwing 895 - 最长上升子序列(最长上升子序列模型)
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 1 ≤ N ≤ ...
最新文章
- 麒麟处理器是基于arm的吗_麒麟芯片是基于ARM构架,如果得不到授权华为还能活吗?...
- 11、Kubernetes集群安全机制
- Python的 is 和 == 弄懂了吗?
- Google Dremel 原理 - 如何能3秒分析1PB
- 水印铺满_一张人民币水印纸的“争气”之路
- mysql数据库切换
- Java 异常处理机制
- python vs golang_Ruby vs Golang:四个维度对比,谁更胜一筹?
- 为什么promise就是微队列?setTimeOut就是宏队列?
- 普通人赚大钱,做好这一点,才是真正的捷径
- Vue学习之路---No.1(分享心得,欢迎批评指正)
- 集群服务器分布式iis_使用nginx实现分布式限流的方法
- 单源最短路(spfa+Dijkstra)附数据
- 全新APP软件游戏应用网站源码+支持WAP/Pbootcms内核
- matlab2018历史命令在哪,2018美赛准备之路——Matlab基础——命令行功能函数
- Docker------网络
- IT常用职位缩写总结
- qq邮箱怎么发送html文件在哪里,QQ邮箱怎么发送文件夹
- iNode 校园网登录一直处于“获取 IP 地址”状态
- php期末作业作业,作业作业作业作业作业作业