浅谈 LIS 问题的几种做法
LIS 问题也就是最长不下降子序列问题,是一个经典的问题。
做法一
我们发现可以动态规划,设 \(f_i\) 表示前 \(i\) 项包含 \(i\) 的 LIS 长度。
有转移方程:
\]
可以用 \(O(n^2)\) 的时间复杂度求解
做法二
有一个经典的 \(O(n \log n)\) 求解 LIS 的算法,本质可能类似贪心?
我们设 \(f_i\) 表示长度为 \(i\) 的 LIS 末尾最小为多少。
那么显然,这个 \(f_i\) 具有单调性,可以用二分维护。
具体实现我就不给了,这个不是我们的重点。
做法三
我们都知道经典的 \(O(n \log n)\) 求解 LIS 需要写一个很烦的二分,但是树状数组就不用啦。
观察动态规划转移方程:
\]
注意到这就是一个二维偏序问题,所以树状数组轻松解决,对于我这种数据结构爱好者简直是福音。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL N=1e5+5;
LL n,a[N],t[N],f[N],mx;
LL lowbit(LL x)
{
return x&-x;
}
LL query(LL x)
{
LL ans=0;
while(x)
{
ans=max(ans,t[x]);
x-=lowbit(x);
}
return ans;
}
void update(LL x,LL y)
{
while(x<=n)
{
t[x]=max(t[x],y);
x+=lowbit(x);
}
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)
{
f[i]=query(a[i])+1;
update(a[i],f[i]);
mx=max(f[i],mx);
}
printf("%lld",mx);
}
浅谈 LIS 问题的几种做法的更多相关文章
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- 浅谈boost.variant的几种访问方式
前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...
- 浅谈js分页的几种方法
一个项目中必然会遇到分页这种需求的,分页可以使数据加载更合理,也让页面显示更美观,更有层次感!那么js分页到底如何实现呢?下面我就来讲一下三种循序渐进的方法 1.自己纯手写分页 更深入的去理解分页的意 ...
- 浅谈 JS 创建对象的 8 种模式
1.Object 模式 var o1 = {};//字面量的表现形式 var o2 = new Object; var o3 = new Object(); var o4 = new Object(n ...
- 浅谈Linux下的五种I/O模型
一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所 ...
- shell实例浅谈之一产生随机数七种方法
一.问题 Shell下有时需要使用随机数,在此总结产生随机数的方法.计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数).伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产 ...
- (转)shell实例浅谈之产生随机数七种方法
一.问题 Shell下有时需要使用随机数,在此总结产生随机数的方法.计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数).伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产 ...
- 浅谈Linux下的五种I/O模型 两篇别人的博客
http://blog.csdn.net/sinat_34990639/article/details/52778562 http://www.cnblogs.com/chy2055/p/5220 ...
- 浅谈Hibernate中的三种数据状态
Hibernate中的三种数据状态:临时.持久.游离 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器 ...
- shell实例浅谈之三产生随机数七种方法
一.问题 Shell下有时须要使用随机数,在此总结产生随机数的方法.计算机产生的的仅仅是"伪随机数".不会产生绝对的随机数(是一种理想随机数).伪随机数在大量重现时也并不一定保持唯 ...
随机推荐
- EF 操作实例
一.Linq语法 List操作 1.1 有参 public List<GoodsInfo> ShowInfo(string GName,int?Gid) { //true ...
- Python ssh远程登录设备执行命令
# -*-encoding:utf-8 -*- """ @Time : 2022/12/30 10:10 @Auth : ruqing @File :ssh_sonic. ...
- 使用request对象实现注册示例,请求方式的编码问题
get提交方式: method="get"和地址栏请求方式默认都属于get提交方式 get方式在地址栏显示请求信息﹐(但是地址栏能够容纳的信息有限,4-5KB;如果请求数据存在大文 ...
- pymysql安装后使用报错处理
1.django启动报错: Error loading MySQLdb module. Did you install mysqlclient? 原因:初次安装配置pymysql时需要在__init_ ...
- Django Models字段设置为空,界面上还校验必填问题
models.CharField(max_length=1000,null=True,blank=True) 其中blank=True是admin管理后台自动校验放开
- 通用图像分割任务- 使用 Mask2Former 和 OneFormer
本文介绍两个领先的图像分割神经网络模型: Mask2Former 和 OneFormer.相关模型已经在 Transformers 提供. Transformers 是一个开源库,提供了很多便捷的先进 ...
- Shell脚本之while read line的用法
Shell脚本之while read line的用法 while read line do - done < file read通过输入重定向,把file的第一行所有的内容赋值给变量line,循 ...
- PGF 概率生成函数 Probability generating function
Probability Mass Function 离散随机变量的分布函数PMF 目录 随机结构举例 two classical combinatorial distributions PGF Pro ...
- CentOS Docker安装、镜像加速
CentOS Docker安装 方法一:使用官方安装脚本自动安装 # 安装命令: curl -fsSL https://get.docker.com | bash -s docker --mirror ...
- ExcelDataReader插件的使用
NPOI插件的弊端 刚来公司的时候公司软件导入导出操作都使用微软的office组件来实现,大家应该都知道这个组件有很大的弊端,就是运行主机上面必须安装office组件才可进行使用,不然无法进行导入导出 ...