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

题意简述

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

  • 范围限制:\(n \le 10^5\)。

样例

5
3 2 1 4 5
1 2 3 4 5

输出:3

思路简述

这道题看似是最长公共子序列,但是发现如果用\(O(n^2)\)的复杂度实现\(LCS\)就会时间超限。所以我们考虑从“\(P_1,P_2\)都是\(1,2,…,n\)的排列”来入手。

我们把每个\(P_1[i]\)都映射成\(i\),相应的\(P_2\)也发生变化。比如样例中把\(3\)都换成\(1\),\(1\)都换成\(3\)。这样\(P_1=\{1,2,3,4,5\},P_2=\{3,2,1,4,5\}\)。显然结果不受影响。

这样我们就把在\(P_2\)中找和\(P_1\)的最长公共子序列,转化成了找\(P_2\)的最长上升子序列。可以用\(O(n\ log\ n)\)的时间复杂度过掉。

注意:不能记录每一个位置最终会换到哪个位置,然后在输入\(P_2\)后把每个值重新移动到那里。这可能会影响结果。比如\(P_1=\{1,3,5,4,2\},P_2=\{5,4,2,1,3\}\)。

  • 按正解应该是\(P_1=\{1,2,3,4,5\},P_2=\{3,4,5,1,2\}\),答案\(3\)。
  • 按这种方法是\(P_1=\{1,2,3,4,5\},P_2=\{5,3,4,1,2\}\),答案\(2\)。

思考:这种优化方式只适用于没有重复元素两序列元素集合相同的情况。

Code

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,a[100010],b[100010];
int f[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int num;
cin>>num;
a[num]=i;
}
for(int i=1;i<=n;i++){
int num;
cin>>num;
b[i]=a[num];
}
int len=0;
for(int i=1;i<=n;i++){
if(b[i]>f[len]){
f[++len]=b[i];
}else{
int p=lower_bound(f+1,f+1+len,b[i])-f;
f[p]=b[i];
}
}
cout<<len<<endl;
return 0;
}

[题解]P1439 【模板】最长公共子序列的更多相关文章

  1. 【Luogu P1439】最长公共子序列(LCS)

    Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...

  2. 最长公共子序列(lcs)

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符 ...

  3. 洛谷 P1439 【模板】最长公共子序列 题解

    每日一题 day40 打卡 Analysis 因为两个序列都是1~n 的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个book数组将A序列的数字在B序列中的位置表示出来 ...

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

    P1439 [模板]最长公共子序列 题解 1.RE的暴力DP O(n2) 我们设dp[i][j]表示,S串的第i个前缀和T串的第j个前缀的最长公共子序列. ◦          分情况: ◦      ...

  5. 洛谷 P1439 【模板】最长公共子序列

    \[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为 ...

  6. P1439 【模板】最长公共子序列(DP)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  7. 洛谷P1439 【模板】最长公共子序列

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

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

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  9. P1439 【模板】最长公共子序列(LCS)

    先来看一看普通的最长公共子序列 给定字符串A和B,求他们的最长公共子序列 DP做法: 设f[i][j]表示A[1~i]和B[1~j]的最长公共子序列的长度 那么f[i][j]=max(f[i-1][j ...

  10. 洛谷 P1439 【模板】最长公共子序列(DP,LIS?)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

随机推荐

  1. 通过chrome插件自动生成博客评论,高效发外链

    最近crazy cattle 3d这个词爆火,很多人都在做,竞争异常激烈,甚至可以说是惨不忍睹. 从最近的数据看,胜出的主要是crazycattle3d.com, crazycattle3d.io, ...

  2. Golang的格式化输出

    一.格式化说明符 通用占位符: %v 值的默认格式表示 %+v 类似%v,但输出结构体时会添加字段名 %#v 值的Go语法表示 %T 打印值的类型 %% 输出百分号 布尔型占位符: %t 接收bool ...

  3. EasyMR:为 AI 未来赋能,打造弹性大数据引擎的革命

    如果要评一个2023科技圈的热搜榜,那么以人工智能聊天机器人 ChatGPT 为代表的 AI大模型 绝对会霸榜整个2023. ChatGPT 于2022年11月30日发布.产品发布5日,注册用户数就超 ...

  4. DotTrace系列:9. 大结局之 跨平台 和 自定义行为 诊断

    一:背景 1. 讲故事 本篇是系列的最后一篇,我们从跨平台部署和自定义诊断的角度跟大家聊一聊 dottrace,希望对大家有所启发. 二:跨平台和自定义诊断 1. 如何跨平台诊断分析 如果 dottr ...

  5. vue_条件渲染、列表渲染

    条件渲染 <html lang="en"> <head> <meta charset="UTF-8"> <title& ...

  6. nginx反向代理,负载均衡和yeauty集成的websocket的使用

    被要求一个这样的需求:要求项目和websocket使用一个端口.经过一周激烈争论,领导终于同意可以可以开通一个端口,一个月了,端口还没有开. 正式环境已经通过此方法进行部署,没有问题. 前言 因涉及到 ...

  7. 深度学习模型在C++平台的部署

    一.概述   深度学习模型能够在各种生产场景中发挥重要的作用,而深度学习模型往往在Python环境下完成训练,因而训练好的模型如何在生产环境下实现稳定可靠的部署,便是一个重要内容.C++开发平台广泛存 ...

  8. winrar无广告最新版

    官网 https://www.dianjilingqu.com/688989.html 目前WinRAR有三个官网,winrar.com.cn,rarlab.com,win-rar.com. winr ...

  9. ETL的全量和增量模式

    在当今信息爆炸的时代,数据管理已经成为各行各业必不可少的一环.而在数据管理中,全量与增量模式作为两种主要的策略,各自具有独特的优势和适用场景,巧妙地灵活运用二者不仅能提升数据处理效率,更能保障数据的准 ...

  10. Economic-Statistics-Investment-Analysis-: 美国上市公司的财务报表分析: 净利润率 + 市场销售增速 + 股东分红

    将经济政治和科学研究.微观和宏观.理论和实践 联合分析: 对每一类精深的统计研究分析 Systematical Method的研究透任何有兴趣的形成经验和个人能力 行业.组织.决策层.高管.个人 Qu ...