【模板】最长上升子序列(LIS)及其优化 & 洛谷 AT2827 LIS
最长上升子序列
传送门
题意
对于给定的一个n个数的序列,找到它的一个最长的子序列,并且保证这个子序列是由低到高排序的。
例如,1 6 2 5 4 6 8的最长上升子序列为1 2 4 6 8。
基本思路
非常显然,这类题用dp求解。 dp[i]表示已i为结尾的最长上升子序列的长度,首先枚举每一个末尾i,然后枚举从1到i-1,如果a[1...i-1]<a[i]说明满足上升子序列,就加上一后取max。
附上代码。
//LIS O(n^2)
#include<iostream>
using namespace std;
int dp[],a[],n,maxx=-;
int main(){
cin>>n;
for(int i=;i<=n;i++) cin>>a[i],dp[i]=;
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+);//如果后面的大于前面的,就取较大的值。
}
maxx=max(maxx,dp[i]); //每次更新最大值
}
cout<<maxx;
return ;
}
O(n^2)代码
优化
//咕了八个半月的优化。。。。
方法是把dp表示的意义倒过来:dp[i]表示长度为i的最长上升子序列的结尾元素最小是什么。
很显然,dp数组一定是单调递增的。
这时,对于每一个a[i],我们做出判断:
- 当a[i]比当前最长的序列的最后一个数字还大,那么长度++;
- 否则就二分查找dp数组中第一个>=a[i]的数值,并把它改为a[i]。
为什么呢?
因为这第一个大于等于a[i]的数的前一个数是最后一个小于a[i]的数,然后a[i]这个数就可以接到那个数的后面,又因为我们要保存的是最小值,就更新为a[i]。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int n,dp[maxn],a[maxn],len;
int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++){
if(a[i]>dp[len]) dp[++len]=a[i];
else{
dp[lower_bound(dp+,dp+len+,a[i])-dp]=a[i];
}
}
cout<<len;
return ;
}
O(nlogn)代码
【模板】最长上升子序列(LIS)及其优化 & 洛谷 AT2827 LIS的更多相关文章
- 洛谷 AT2827 LIS
题目传送门 解题思路: 用f[i]表示长度为i的最长上升子序列的最小的末尾. AC代码: #include<iostream> #include<cstdio> #includ ...
- 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence
问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...
- POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)
Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...
- 【单调栈】最长不上升子序列变式,洛谷 P2757 导弹的召唤
题目背景 易琢然今天玩使命召唤,被敌军用空对地导弹轰炸,很不爽:众所周知,易琢然很不老实,他开了外挂: 外挂第一次可以打掉任意高度的导弹,之后每一次都不能打掉大于上一次高度的导弹: 但易琢然水平太差, ...
- P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1<...<Ti和Ti>Ti+1>…>TK可以看出这题涉及最长上升子序列和最长下降子序列 2 ...
- 模板:二维树状数组 【洛谷P4054】 [JSOI2009]计数问题
P4054 [JSOI2009]计数问题 题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 ...
- AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369
[模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...
- 洛谷 P3808 【模板】AC自动机(简单版)洛谷 P3796 【模板】AC自动机(加强版)
https://www.cnblogs.com/gtarcoder/p/4820560.html 每个节点的后缀指针fail指针指向: 例如he,she,his,hers的例子(见蓝书P214): 7 ...
- 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]
P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...
随机推荐
- Mapnik连接文件数据、数据库中的vertor数据和raster数据
Mapnik的XML文件,选择其中一个Datasource. <?xml version="1.0" encoding="utf-8"?> < ...
- Vue-Router的简单使用
Vue-Router的最简单使用 1.先注册路由 2.将路由注册到VM组件中 3.定义组件 4.页面定义跳转路径 <!DOCTYPE html> <html> <head ...
- 配置中心Apollo多环境部署
- 用Java 实现断点续传 (HTTP)
在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...
- 序列式容器————forward_list
单链表的形式存储元素.forward_list 的模板定义在头文件 forward_list 中.fdrward_list 和 list 最主要的区别是:它不能反向遍历元素:只能从头到尾遍历. for ...
- Selenium-webdriver+八种元素定位
进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素 ...
- 第十周java学习总结
目录 第十周java学习总结 学习内容 代码上传截图 代码链接 第十周java学习总结 学习内容 第12章 Java多线程机制 主要内容 Java中的线程 Thread类与线程的创建 线程的常用方法 ...
- legend3---Homestead中Laravel项目502 Bad Gateway
legend3---Homestead中Laravel项目502 Bad Gateway 一.总结 一句话总结: 用查看错误日志的方法解决错误:(/var/log/nginx/.log) 1.home ...
- word文档每章的页眉页脚设置
1. 每章后面插入分隔符,下一页. 2. 编辑页眉,取消选中链接的上一页,然后编辑页眉即可.
- phpmyadmin普通用户使用配置
正常情况需求是,普通用户可以管理特定的数据库,可能也需要能新建数据库,配置如下: 1.添加用户,phpmyadmin和应用访问,所以主机设置127.0.0.1访问即可 2.如果只管理一个数据,可以选择 ...