首页 > TAG信息列表 > p1439

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

题目: https://www.luogu.com.cn/problem/P1439 离散化+最长公共子序列的优化 离散化的例子:求2314 和3142的最长公共子序列2  3  1  4 1  2  3  4 3  1  4  2 2  3  4  1 #include<stdio.h> #include<algorithm> using namespace std; const int maxn=1e5+6; int n; i

洛谷p1439 最长子序列

传送门 规模10^5,经典的模板题,但是还要优化 普通最长公共子序列思路: 当p1[i]与p2[j]不相等时:dp[i][j]=max(dp[i-1][j], dp[i][j - 1]) 当p1[i]与p2[j]相等时:dp[i][j]=max(dp[i-1][j], dp[i][j - 1], dp[i-1][j-1]+1) 刚开始直接开了一个N*N的数组,结果报错,百度都搜不到的报错信

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

虽然这是我第一次写博客,但是我会做到最好的。 好的废话不多说,下面就是答案  ↓ (仅供参考) #include<cstdio>  #include<algorithm> #include<cstring> using namespace std; const int N=101000; int b[N],idx[N],n; int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'

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

P1439 【模板】最长公共子序列 题解 f[]维护当前最长的公共子序列,f[i]是这条子序列的第i个数在a中的位置。易知f[]是递增的。 对于b的第i个数b[i],找到其在a中的位置mp[b[i]],如果mp[b[i]]大于f[len],说明b[i]这个数可以加到当前最长子序列后面。 不然的话要想把b[i]这个数加到子序

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

知识点: 线性DP,LCS,LIS 原题面 题目要求: 给定 \(1,2,\dots n\) 的两个排列 \(a,b\),求其最长公共子序列。 \(n\le 10^5\) 分析题意 算法一 有一个极其显然的做法。 设 \(f_{i,j}\) 为,\(a\) 中匹配到第\(i\) 位,\(b\) 中匹配到第 \(j\) 位时,最长公共子序列的长度。 讨论 \(a_i\)

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

题意:给出两个序列,求最长公共子长度 思路:第一种直接暴力,代码如下: 1 #include<iostream> 2 using namespace std; 3 const int maxn=1e5+10; 4 int dp[maxn][maxn]; 5 int a1[maxn],a2[maxn],n,m; 6 int main() 7 { 8 //dp[i][j]表示两个串从头开始,直到第一个串的第i

dp--P1439 最长公共子序列(LCS)

题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列。 输入格式 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列。 输出格式 一个数,即最长公共子序列的长度 找出两个序列共同出现的元素,每个元素包括两个维度,一个为在a中的位置,一个为在b中的位置,我们首先

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

题目连接:https://www.luogu.com.cn/problem/P1439   思路: 因为题目数据较大,不能用一般的最长相同子序列来求,所以可以将序列1中的编号放到序列2中,在两个序列中都递增的子序列就是最长相同的子序列,所以题目就转化为求转化过的bi串的最长上升子序列就好了。   代码: #include <b

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

每日一题 day40 打卡 Analysis 因为两个序列都是1~n 的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个book数组将A序列的数字在B序列中的位置表示出来 因为最长公共子序列是按位向后比对的,所以a序列每个元素在b序列中的位置如果递增,就说明b中的这个

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

题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列。 输入输出格式 输入格式:   第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列。   输出格式:   一个数,即最长公共子序列的长度   输入输出样例 输入样例#1: 复制 5 3 2 1 4 51 2 3 4 5 输出样例#1: 复制 3

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

题目链接 P1439 【模板】最长公共子序列 思路 第一种 $O(N^2)$ 用f[i][j]表示第一个排列取到i位和第2个排列取到j位的公共子序列长度 $$f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1])$$ 最后一种情况需满足$a[i]==b[i]$ 对于$50%$的数据,$n≤1000$,应该可以过 第二种 $O(n \cdot log

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

\[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列。 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为自然数\(1-n\)的一个排列。 输出格式: 一个数,即最长公共子序列的长度 输入输出样例 输入样例#1: 5 3 2 1 4 5 1 2

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

原题 原题 思路 将第一个序列依次从左到右标号,然后映射到第二个序列中 因为第一个序列标号只上升的所以问题就转化为序列2标号后的最长上升子序列 代码 #include<cstdio>#include<algorithm>using namespace std;const int MAXN=100010;int n,a[MAXN],b[MAXN];int c[MAXN];int sta