P1439 【模板】最长公共子序列

news/2024/9/18 3:41:47/文章来源:https://www.cnblogs.com/ltphy-/p/18408798

link

【模板】最长公共子序列

题目描述

给出 $1,2,\ldots,n$ 的两个排列 $P_1$ 和 $P_2$ ,求它们的最长公共子序列。

输入格式

第一行是一个数 $n$。

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

输出格式

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

样例 #1

样例输入 #1

5 
3 2 1 4 5
1 2 3 4 5

样例输出 #1

3

提示

  • 对于 $50%$ 的数据, $n \le 10^3$;
  • 对于 $100%$ 的数据, $n \le 10^5$。

算法1

(LCS -> LIS) $O(n*logn)$

注意点:

看数据范围 $n \le 10^5$ 用朴素的LCS** $O(n^2)$**,肯定会超时;

想办法优化一下,我们直到最长上升子序列有一个二分优化版本: $O(nlogn)$

那么如何把最长公共子序列问题转化为最长上升子序列问题呢?

1.首先由题意可知,每行是已$1- n$组成的排列,说明两个数组中出现的元素是相同的,只是元素所在的位置不同

2.特性:最长公共子序列不是唯一的,但最长公共子序列的长度是唯一的

3.那么我们利用这一点,用st[]数组存放,a序列当中每个元素在b序列中出现的顺序,求b的最长LIS

看样例分析


a[]  : 3 2 1 4 5
b[]  : 1 2 3 4 5st_a : 1 2 3 4 5
st_b : 3 2 1 4 5 b中的最长上升子序列 : 1 4 5 

已知a数组是单调递增的,因此在b序列中找到的子序列,一定是a的子序列,

保证当前f[]中存放的是上升子序列的最小结尾值的下标

C++ 代码

//O(nlongn)
#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int n;
int a[N],b[N];
int st[N];  //再a序列当中出现的位置
int f[N];   //当前公共子序列中结尾下标最小的int main() {scanf("%d",&n);for(int i = 1; i <= n; i++) {scanf("%d",&a[i]);st[a[i]] = i;}for(int i = 1; i <= n; i++) {scanf("%d",&b[i]);}int len = 0;   //一开始为空集for(int i = 1; i <= n; i++) {int l = 0, r = len;if(st[b[i]] > f[len]) f[++len] = st[b[i]];else {while(l < r) {int mid = l + r >> 1;if(f[mid] > st[b[i]])   //找第一个大于st[b[i]]的下标r = mid;else l = mid + 1;}f[l] = min(f[l],st[b[i]]);   //两者当中取较小的 }}printf("%d",len);return 0;
}

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

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

相关文章

关闭默认WPS打开方式

原文链接:https://blog.csdn.net/Candy_SJ_/article/details/139898009 文件默认为wps打开,有时候有很多问题。关闭wps默认打开方式 还是有问题,我这边是将wps卸载了。

0基础开始Pine量化 止盈改进策略(附代码)

止盈的核心思想: 当市场价格达到设定的目标后,投资者会卖出资产,防止市场波动将已经取得的利润变为损失。 通过止盈,投资者在确保一定盈利的情况下退出市场,而不是继续持有以追求更高的收益,从而避免市场行情逆转带来的风险。0基础开始Pine量化 止盈改进策略(附代码) 可…

词表示与语言模型、大模型背后的范式

这张幻灯片讨论了大模型背后的范式,特别是预训练和微调的基本范式可以追溯到迁移学习。以下是主要内容:迁移学习 :预训练和微调的基本范式可以追溯到迁移学习。 人类可以应用之前学到的知识更快地处理新问题,我们希望机器也具有类似的能力。传统机器学习 vs. 迁移学习 :左…

词表示与语言模型

不积跬步,无以至千里;不积小流,无以成江海。

文件对比工具--BeyondCompare

💖简介 Beyond Compare 是一款功能强大的文件和文件夹比较工具,由Scooter Software开发。它可以帮助用户轻松地比较文件和文件夹的差异,并且可以合并变化、同步文件以及备份重要数据 💻环境 windows 📖版本 Beyond Compare v5.0.2 🔗地址 https://www.scootersoftwar…

基于sqli-labs Less-1的sql注入原理详细讲解

SQLi Labs 是一个专为学习和测试 SQL 注入漏洞而设计的实验室平台。它旨在帮助安全研究人员、开发者以及网络安全爱好者深入理解和实践各种 SQL 注入攻击。SQLi Labs 提供了一系列精心设计的实验室环境和挑战,模拟真实的 SQL 注入漏洞,并提供相应的解决方案。 关于sqli-labs靶…

UE4(5)逆向学习笔记(三)——UEDumper源码学习

目录0.前言1.准备2.开始阅读2.1 设置版本和Offset2.2 获取GName2.3 使用GName2.4 获取GUObjectArray2.5 使用GUObjectArray2.6 寻找dump主流程2.6.1 ObjectsManager::copyGObjectPtrs2.6.2 ObjectsManager::copyUBigObjects2.6.3 EngineCore::cacheFNames2.6.4 Engin…

k8s dashboard token 生成/获取

创建示例用户在本指南中,我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount,ClusterRoleBinding您都应该将它们复制到新的清单文件(如)中,dashboard-admin…

个人项目

这个作业属于哪个课程 计科22级12班这个作业要求在哪里 作业要求 这个作业的目标 完成个人项目,实现论文查重的功能,了解软件开发流程Github链接 一.PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 15 20Estimate 估计这个任务…

互联网医疗|基于音视频SDK和即时通讯IM技术实现线上问诊功能

不论是科普医学知识,还是医疗行业者的专业培训、手术示教,采用远程直播培训的方式能够打破空间限制,同时也保留了课堂的互动性,大大节省了讲师和学员的成本。帮助开发者全面监测音视频服务,包括问题定位诊断、洞察质量与体验、业务经营分析、实时监控告警等,低门槛、高效…

Spring boot 2.x validator

1、使用方式 2、常用注解

DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed

前言 DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed 遇到 "Public Key Retrieval is not allowed" 错误时,通常意味着你正在使用的身份验证方法需要加密连接,但是没有正确地配置客户端或服务器来支持这种加密。 解决 第一种 可以在连接字符串中添…