首页 > 其他分享 >LIS 问题

LIS 问题

时间:2024-06-21 12:34:07浏览次数:13  
标签:int 问题 MAXN vec LIS 长度 include

LIS 问题

LIS,即最长上升子序列。

1. 朴素的求法

使用动态规划,\(dp_i\) 代表以第 \(i\) 位结尾的最长上升子序列长度。得动态转移方程:

\[dp_i = \max_{j < i \text{ 且 } a_i > a_j} dp_j + 1 \]

Code1

#include <iostream>
using namespace std;
#define MAXN 100005
int a[MAXN],f[MAXN];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	int ans=-1;
	for(int i=0;i<n;i++)
	{
		f[i]=1;
		for(int j=0;j<i;j++) if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);
		ans=max(f[i],ans);
	}
	cout<<ans<<endl;
	return 0;
}

时间复杂度:\(O(n^2)\)。

2. 优化处理

维护一个数组 \(vec\),\(vec_i\) 表示长度为 \(i+1\) 的 LIS 的最小的终点。

长度相同的 LIS 只存终点的最小值。

随着 LIS 长度的增加,其结尾的值(最小的那个)一定是单调递增的。比如:长度为 \(4\) 的 LIS 的终点值 \(<\) 长度为 \(5\) 的 LIS 的终点值。

该策略是让小元素尽可能更新在前面,替换掉前面的大元素,这是因为前面的数越小,LIS 的长度才可能越长。

举例 \(a = [1,5,2,3,4,6]\)。

更新 \(vec\) 过程如下:

  1. 第一个 \(1\) 来,\(vec_0 = 1\) 此时 \(vec=[1]\)。
  2. 第二个 \(5\) 来,因为 \(5 > 1\),\(vec\) 拓展,\(vec_1 = 5\),此时 \(vec = [1,5]\)。
  3. 第三个 \(2\) 来,而 \(2 < 5\),替换之,\(vec_1 = 2\),此时 \(vec = [1,2]\)。
  4. 第四个 \(3\) 来,因为 \(3 > 2\),\(vec\) 拓展,\(vec_2 = 3\),此时 \(vec = [1,2,3]\)。
  5. 第五个 \(4\) 来,因为 \(4 > 3\),\(vec\) 拓展,\(vec_3 = 4\),此时 \(vec = [1,2,3,4]\)。
  6. 第六个 \(6\) 来,因为 \(6 > 4\),\(vec\) 拓展,\(vec_4 = 6\),此时 \(vec = [1,2,3,4,6]\)。

最后返回 \(vec\) 数组的长度 \(LIS = 5\)

Code2

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 100005
#define inf 2147483647
int n,a[MAXN],tot;
vector<int> vec;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++)
    {
        int tem=lower_bound(vec.begin(),vec.end(),a[i])-vec.begin();
        if(tem==vec.size())
            vec.push_back(a[i]);
        else vec[tem]=a[i];
    }
    cout<<vec.size();
    return 0;
}

类似的,其他几种 LIS 求法如下:

  • 最长下降子序列:进行 reverse 操作。
  • 最长不增子序列:lower_bound 变为 upper_bound
  • 最长不降子序列:进行 reverse 操作并将 lower_bound 变为 upper_bound

练习

原文链接:

https://blog.csdn.net/shizheng_Li/article/details/105572886

标签:int,问题,MAXN,vec,LIS,长度,include
From: https://www.cnblogs.com/zhangyuyi1218/p/-/LIS_problem

相关文章

  • LCS 问题
    LCS问题LCS,即最长公共子序列。1.朴素的求法使用动态规划,\(dp_{i,j}\)代表以序列\(a\)第\(i\)个字母结尾,序列\(b\)第\(j\)个字母结尾的LCS长度。得动态转移方程:\[dp_{i,j}=\left\{\begin{matrix}\max(dp_{i-1,j},dp_{i,j-1})&a_i\neb_j\\dp_{i-1,j-1}......
  • 解锁测试管理的核心问题,提升你的管理实力!
    如何打造积极向上,主动,执行力强,不推诿,不甩锅,服从安排,和谐,互帮互助的团队?如何有效的追踪团队的测试效率,后续对测试时间,质量等评估做支持?作为测试管理的你,是不是会遇到各种问题,不知道如何处理?霍格沃兹测试开发学社于本周六组织了测试管理圆桌讨论会 。本次邀请了多位名企测试管理......
  • Tcp粘包半包问题(现实场景举例帮助理解)
    理解粘包问题时,我们可以将这个过程想象得更加生活化一些。想象你正在经营一家水果拼装店,你的任务是接收来自不同客户的水果订单,并将这些水果按照订单要求重新组装起来。每份订单中的水果都事先被切成了便于快递的“水果片”,并通过同一条传送带送过来。现在,你收到了两份订单,一......
  • 数位统计DP——AcWing 338. 计数问题
    数位统计DP定义数位DP(DigitalDP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。运用情况统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。计算......
  • Python 学习 第三册 第12章 图的最优化问题
    ----用教授的方式学习。目录12.1图的最优化问题12.1.1最短路径:深度优先搜索和广度优先搜索12.1图的最优化问题我们下面研究另一种最优化问题。假设你有一个航空公司航线的价格列表,其中包括美国任意两个城市之间的航班价格。假设有3个城市A、B和C,从A出发经过B到达C的价格......
  • 记录一次代码中的ForkJoinPool.getCommonPoolParallelism()
    @Configuration@Slf4jpublicclassThreadPoolConfig{privatestaticfinalintCORE_POOL_SIZE=6;privatestaticfinalintMAX_POOL_SIZE=12;privatestaticfinalintKEEP_ALIVE_TIME=60;privatestaticfinalintQUEUE_CAPACITY=......
  • 解决页面刷新后firefox浏览器中iframe内容不更新的问题
    最近遇到了一个问题:使用firefox浏览切换2层iframe下的某个页面后iframe内容未更新,Chrome和Edge浏览器并无这个问题。在这个项目中,最外层的iframe用于隐藏url,里层的iframe用于给不同参数的url提供一个统一地址以便于权限路由等控制。 由于项目比较复杂,用简单的代码很难去复现这个......
  • 【转载】解决使用 git 时出现unable to access “xxx‘: error settingcertificate ve
    1、出现原因:在使用idea的时候,进行git下的push,出现下面的错误:2、原因分析:检查idea中git的安装位置是否发生了变化3、解决方案:找到git的安装路径,双击打开git-bash.exe进行输入:gitconfig--systemhttp.sslverifyfalse问题解决!!!......
  • svg标签内容导出为svg文件问题
     原本的代码://大概代码层级//html代码<divref="svgContainer"><div>//js代码//1、div中添加svgconstsvg=d3.select(svgContainer.value).append("svg).attr("id",svgElement").attr("xmlns","http://www......
  • Windows11系统win32ui.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个win32ui.dll文件(挑选合适的版本文件)把它放......