首页 > 其他分享 >[题解]P1439 【模板】最长公共子序列

[题解]P1439 【模板】最长公共子序列

时间:2024-03-30 12:22:21浏览次数:26  
标签:int 题解 len num P1439 公共 序列 最长 模板

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;
}

标签:int,题解,len,num,P1439,公共,序列,最长,模板
From: https://www.cnblogs.com/Sinktank/p/18105303

相关文章

  • yii2 Gii使用和自定义模板
    yii2Gii使用和自定义模板配置开启giiconfig/web.php添加代码if(YII_ENV_DEV){$config['bootstrap'][]='gii';$config['modules']['gii']=['class'=>'yii\gii\Module',];}入口脚本web......
  • 软件项目管理(开发/实施/运维/安全/交付)全套文档模板
      前言:在软件项目管理中,每个阶段都有其特定的目标和活动,确保项目的顺利进行和最终的成功交付。以下是软件项目管理各个阶段的详细资料:软件项目全套文档资料下载:点我获取1.需求阶段目标:收集、分析和定义用户需求和业务目标。主要活动:需求调研:与用户沟通,了解他们的需求......
  • delphi ORM和泛型模板
    delphiORM和泛型模板实现CRUD1)定义数据模型(data-model)数据模型是ORM数据序列/还原所必需的。TTable<T:record>=record//1个表rows:TArray<T>;//表的行end;TTable2<T,T2:record>=record//2个表table1:TTable<T>;......
  • P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并
    P4556[Vani有约会]雨天的尾巴/【模板】线段树合并在这题里面讲一下线段树合并。顾名思义就是把多个线段树合并成一个。显然完全二叉线段树(也就是普通线段树)是无法更高效的合并的,只能把所有节点加起来建个新树。但是在动态开点线段树中,有时候一个树只有几条链,这时候我们就是可......
  • 类模板
    1.类模板的基本范例和模板参数的推断基本范例:类模板,也是生产类的工具,通过给定的模板参数,生成具体的类。类模板的声明和实现一般都放在同一个头文件中,因为实例化的时候必须有类模板的全部信息。template<typenameT>//T表示myvector这个容器所存储的元素类型classmyvector......
  • 2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有......
  • 2024年03月CCF-GESP编程能力等级认证C++编程七级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题下列关于排序的说法,正确的是()。A.冒泡排序是最快的排序算法之一。B.快速排序通常是不稳定的。C.最差情况,N个元素做归并排序......
  • 类模板中的友元
    1.友元类传统友元类的概念是:让某个类B成为另外一个类A的友元类,这样的话,类B就可以在其成员函数中访问类A的所有成员(成员变量、成员函数),而不管这些成员在类A中是用什么修饰符(private、protected、public)修饰的。如果现在类A和类B都变成了类模板,那么能否让类模板B成为类模板A的友元......
  • ccfcsp-2019-12-2回收站选址(c++满分题解)
    该题就是考察点的保存以及索引的保存和遍历,看了他的用例说明,我原先以为暴力只能得50分,但是又没有想到别的优化方法,就写了一下暴力,发现居然AC下面是代码:#include<iostream>#include<vector>#include<map>usingnamespacestd;intmain(){ intn; cin>>n; vector<pair<......
  • atcoder beginner 346 题解
      看到别人的视频讲解 AtCoderBeginnerContest346A至G題讲解bydreamoon C如果用sort写,那么再从小到大遍历也需要写几行#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<cstdbool>#include<string>#include<......