洛谷 P1439 【模板】最长公共子序列【线性dp+dp模型转换】

原题链接:https://www.luogu.com.cn/problem/P1439

题目描述

给出 1,2,…,n 的两个排列 P1​ 和 P2​ ,求它们的最长公共子序列。

输入格式

第一行是一个数 n。

接下来两行,每行为 n 个数,为自然数 1,2,…,n 的一个排列。

输出格式

一个数,即最长公共子序列的长度。

输入输出样例

输入 #1

5 
3 2 1 4 5
1 2 3 4 5

输出 #1

3

说明/提示

  • 对于 50% 的数据, n≤1e3;
  • 对于 100% 的数据, n≤1e5。

解题思路:

首先一看题目,我去这不是经典dp模型最长公共子序列吗,这也太简单了,本来准备直接上最长公共子序列的模板秒了,但是一看数据范围,n=1e5,最长公共子序列模板题的时间复杂度为O(n^2),这里的n=1e5,时间复杂度就到达了1e10,这也太高了,这个时间复杂度肯定过不了,这个时候肯定是观察状态转移方程根据状态转移方程看能不能进行优化,一看状态转移方程好像找不到什么好的优化方式,这个优化方式不存在,我们再看是否能够挖掘什么性质进行优化,我们可以发现a,b数组都是一个1-n的一个排列,也就是说俩个数组中都是1-n中的每个数只出现一次,下面让我们来画一个图模拟一下题目给出的样例,看看是否具有什么性质。

(1):首先我们知道公共子序列是每个位置都对应相等的,例如上述图中描述的样例,如果我们选择3,那么第一个序列的3和第二个序列的3就都要选上,那么此时就无法选择1和2,因为如果还选择1,那么第一个序列中选出的就是[3,1],第二个序列中选出的就是[1,3],这样俩个序列都不相同的了,肯定是不行的,然后如果选择2第一个序列就是[3,2],第二个序列就是[2,3]了,这也肯定是不行的,但是我们选择1之后是可以选择4和5的,这个时候我们就可以发现一个明显的性质了,这个性质就是我们将俩个数组a和b数值相等的位置连线之后,我们选择的公共子序列的所有数值对的连线不能不能存在交叉的现象。

(2):那么我们怎么保证我们选择的所有数值对的连线不交叉呢,我们可以根据数组a各个元素的相对位置来进行对应映射对数组b进行重新赋值,例如上述图中样例,在数组a中3位于第一个位置,所以将b数组中的3重新赋值为1 ,数组a中2位置第二个位置,所以将b数组中的2重新赋值为2,其他的也是如下赋值即可,这样原来的数组b为[1,2,3,4,5],就转换为了[3,2,1,4,5],对于映射之后重新赋值的新数组b,选择了某个位置之后,就不能选择b之前比当前选择位置大的数,不能选择b之后比当前位置小的数,例如这个新b数组选择了1之后,就不能选择1之前的2,3,但是可以选择1之后的4,5,看到这个这不就是求最长上升子序列吗,这个时候我们就将题目原本的求最长公共子序列变为了求新的b数组最长上升子序列,这个题目n=1e5,不能采用最长上升子序列的朴素dp写法,因为最长上升子序列的朴素dp写法时间复杂度为O(n^2),这个复杂度过不了,应该采用最长上升子序列的二分+贪心的那个写法,这种写法时间复杂度为O(nlogn),这个时间复杂度是可以过的。

时间复杂度:将原本求最长公共子序列转换为求映射的新数组b的最长上升子序列,使用求最长上升子序列的二分+贪心写法时间复杂度为O(nlogn)

总结:这个题目属于诈骗题了,题目表面是求最长公共子序列,但是n非常大,n=1e5,显然最长公共子序列的那个O(n^2)解法过不了,观察状态转移方程也没有发现很明显的优化方式,但是我们画图之后发现了一个性质,就将原本的求最长公共子序列变为了求最长上升子序列,然后采用最长上升子序列二分+贪心写法这个题目就可以过了,这个题目纯属套着羊皮的狼,挂羊头卖狗肉,题目给的虽然是求最长公共子序列,但是本质上就是求最长上升子序列。

启发:

至于我为什么能发现这个性质是因为我做一个非常像的题,所以很快就发现了这个性质,很快就解决了这个题目,所以说还是需要学会知识的迁移吧,对于学到的东西多加总结融会贯通还是有好处的,这样对于学过的东西,以后遇到类似的题目还是有帮助的。

那个很像的题目的链接:https://www.acwing.com/problem/content/1014/

cpp代码如下

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>using namespace std;const int N = 1e5 + 10;int n;
int a[N], b[N], f[N];
int q[N];
int main()
{cin >> n;unordered_map<int, int> mp;for (int i = 1; i <= n; i++)scanf("%d", &a[i]), mp[a[i]] = i;for (int i = 1; i <= n; i++)scanf("%d", &b[i]), b[i] = mp[b[i]]; // 根据a数组对b数组重新赋值,映射出一个新的b数组// 对于新映射出的b数组求最长上升子序列,这里是最长上升子序列的二分+贪心的写法,时间复杂度O(nlogn)int len = 0;for (int i = 1; i <= n; i++){int l = 0, r = len;while (l < r){int mid = l + r + 1 >> 1;if (q[mid] < b[i])l = mid;elser = mid - 1;}len = max(len, r + 1);q[r + 1] = b[i];}// len记录的就是新b数组的最长上升子序列cout << len << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023 年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷 B部分解析

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析 【赛程名称】第一场&#xff1a;模块一 私有云、模块二 容器云【任务 1】私有云服务搭建[5 分]【题目 1】1.1.1 基础环境配置[0.2 分]【题目 2】1.1.2 Yum 源配置[0.2 分]【题目 3】1.1.3 配置无秘钥 ssh[0.2 分]【题…

Keil5如何生成反汇编文件

Keil5如何生成反汇编文件 在Keil5界面下点击选项&#xff0c;选择“User”&#xff0c;勾选“After Build/Rebuild”中“RUN #1”&#xff0c;复制fromelf --text -a -c --outputxxx.dis xxx.axf 在Linker栏中找到“Linker Control string”里最后-o后的.axf文件&#xff0c;将…

Linux:nginx设置网站https

http和https的区别 http: 80 https: 443 这种协议比http协议要安全&#xff0c;因为传输数据是经过加密的 HTTPS简介 HTTPS其实是有两部分组成&#xff1a;HTTP SSL / TLS&#xff0c;也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过…

Nginx的安装配置和使用

最近有好几个地方用到了nginx&#xff0c;但是一直还没时间记录下nginx的安装、配置和使用&#xff0c;这篇文章可以将这块内容整理出来&#xff0c;方便大家一起学习~ 安装 安装是相对简单一些的&#xff0c;直接使用yum即可。 yum install -y nginx 默认安装位置在/usr/sb…

Linux------进程的初步了解

目录 一、什么是进程 二、进程的标识符pid 三、getpid 得到进程的PID 四、kill 终止进程 五、父进程与子进程 六、目录中的进程 一、什么是进程 在windows中&#xff0c;我们查看进程很简单&#xff0c;打开任务管理器&#xff0c;就可以看到在运行的进程。这里我们还可以…

STM32H5 Nucleo-144 board开箱

文章目录 开发板资料下载 【目标】 点亮LD1&#xff08;绿&#xff09;、LD2&#xff08;黄&#xff09;和LD3&#xff08;红&#xff09;三个LED灯 【开箱过程】 博主使用的是STM32CubeMX配置生成代码&#xff0c;具体操作如下&#xff1a; 打开STM32CubeMX&#xff0c;File-…

Raspberry Pi 4B 蓝牙串口(SPP)配置与使用

Raspberry Pi 4B 蓝牙串口&#xff08;SPP&#xff09;配置与使用 文章目录 Raspberry Pi 4B 蓝牙串口&#xff08;SPP&#xff09;配置与使用1、蓝牙相关命令工具2、Linux中的蓝牙堆栈3、蓝牙串口配置4、蓝牙串口数据发送与接收 本文将详细介绍如何在Raspberry Pi 4B卡片电脑中…

快速入门java网络编程基础------Nio

一. NIO 基础 哔哩哔哩黑马程序员 netty实战视频 0.什么是nio&#xff1f; NIO&#xff08;New I/O&#xff09;是Java中提供的一种基于通道和缓冲区的I/O&#xff08;Input/Output&#xff09;模型。它是相对于传统的IO&#xff08;InputStream和OutputStream&#xff09;模型…

Spring boot - Task Execution and Scheduling @Async

SpringBoot的任务执行器 Spring Boot通过auto-configuration机制自动创建了任务执行器Task Execution&#xff0c;因此在SpringBoot项目中&#xff0c;你不需要任何配置、也不需要自己创建Task Execution就可以直接使用它。 Spring Boot通过auto-configuration机制创建的任务…

nodejs+vue+ElementUi银行贷款业务管理系统

银行贷款管理系统的主要实现功能包括&#xff1a;管理员&#xff1a;首页、个人中心、用户管理、银行管理、贷款信息管理、贷款申请管理、金额发布管理、还款信息管理、通知信息管理&#xff0c;用户&#xff1a;首页、个人中心、贷款信息管理、贷款申请管理、金额发布管理、还…

phpinfo和php -m 加载的php.ini不一致

目的&#xff1a; 将phpinfo在web中展示的php.ini和在命令行中展示的php.ini加载路径设置一致。 原本的php.ini加载路劲是&#xff1a; /usr/local/lib/php.ini 解决思路&#xff1a; &#xff08;1&#xff09;which php 查看服务器加载的php的位置&#xff0c;这里原来是&a…

差分算法模板

差分算法模板 一维差分一维insert函数(构造差分数组和实现区域加数操作)一维差分模板题 二维差分二维insert函数(构造差分数组和实现区域加数操作)二维差分模板题 一维差分 差分主要是计算出某个区域段的数分别加上一个数 先给定一个原数组a&#xff1a;a[1], a[2], a[3], a[n]…

CNN:Convolutional Neural Network(上)

目录 1 为什么使用 CNN 处理图像 2 CNN 的整体结构 2.1 Convolution 2.2 Colorful image 3 Convolution v.s. Fully Connected 4 Max Pooling 5 Flatten 6 CNN in Keras 原视频&#xff1a;李宏毅 2020&#xff1a;Convolutional Neural Network 1 为什么使用…

NumPy:从初识到实战,探索Python科学计算的无限可能

NumPy 在浩瀚的Python编程世界中&#xff0c;有一个强大的库如星辰般璀璨&#xff0c;它是数据科学家、机器学习工程师乃至量化金融分析师手中的利器——NumPy&#xff0c;它以其高效的数据处理能力和便捷的矩阵运算机制&#xff0c;在科研与工程领域中占据着举足轻重的地位。…

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO BIO、NIO、AIO特点和场景 BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;、AIO&#xff08;Asynchronous I/O&#xff09;是Java中用于处理I/O操作的三种不同的I/O模型&#xff0c;它们具…

day16 二叉树的最大深度 n叉树的最大深度 二叉树的最小深度 完全二叉树的节点数

题目1&#xff1a;104 二叉树的最大深度 题目链接&#xff1a;104 二叉树的最大深度 题意 二叉树的根节点是root&#xff0c;返回其最大深度&#xff08;从根节点到最远叶子节点的最长路径上的节点数&#xff09; 递归 根节点的的高度就是二叉树的最大深度 所以使用后序遍…

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权&#xff0c;请参考【系列一、认证 & 授权】&#xff0c;这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…

思科模拟器中环境条件设置第一步

一直设想若上图中的温度在不同房间显示和物理环境一样的结果。 于是乎看了 经过实验 原因是 在模拟器的physcial中设置就可以实现不同的温度。 接下来就是合理使用了&#xff01; 对类似实验感兴趣的同学&#xff0c;一起加入尝试&#xff1a;微信号imaguofeng 2024年1月14…

计算机找不到vcomp140.dll怎样修复?马上教会你修复dll问题

在计算机系统运行过程中&#xff0c;遭遇“vcomp140.dll丢失”的场景并不少见&#xff0c;这一问题的出现往往伴随着软件无法正常启动、运行时错误提示或者系统性能下降等现象。具体场景可能包括但不限于&#xff1a;用户在尝试打开某个依赖于Visual C Redistributable库的应用…

数据在AI图像修复任务中的核心作用

在人工智能&#xff08;AI&#xff09;领域&#xff0c;数据的重要性不言而喻。尤其在图像修复任务中&#xff0c;数据的精度和质量直接影响着AI模型的性能。图像修复是指利用AI技术自动识别图像中的缺陷或遮挡物&#xff0c;并对其进行修复或还原的过程。这项技术广泛应用于各…