最长公共子序列转最大上升子序列(洛谷p1439)

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列转最大上升子序列(洛谷p1439)相关的知识,希望对你有一定的参考价值。

又是一事无成的一天呢

但是不得不水一篇,毕竟我是个有始有终的人(bushi)

今天这题是几个礼拜前刷dp题刷到的

明天找题号

P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

给两个1-n的全排列,求最长公共子序列

我觉得题解通过把原序列中的其中一个转换成1-n的序列,另一个按照转化关系转成新序列,然后求新序列的最大上升子序列的方法很好玩

52314

21453

我们再加一行成

52314

21453

12345

序列2和3形成新的转化关系

1➡2

2➡1

3➡5

4➡3

5➡4

序列1即为41523,最长上升子序列是3,245位,看原序列确实如此()

代码

#include<bits/stdc++.h>
using namespace std;
int st[100005],yu[1000005],dp[100005];
int main()
{
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>m;
		st[m]=i;
	}
//	for(int i=1;i<=n;i++)
//	{
//		cout<<st[i];
//	}
// C++ Version

	for(int i=1;i<=n;i++)
	{
		cin>>m;
		yu[i-1]=st[m];
	}
	//	for (int i = 0; i < n; ++i) scanf("%d", a + i);
	memset(dp, 0x1f, sizeof dp);
	int mx = dp[0];
	for (int i = 0; i < n; ++i) {
  	*std::upper_bound(dp, dp + n, yu[i]) = yu[i];
	}
	int ans = 0;
	while (dp[ans] != mx) ++ans;
	cout<<ans;
 } 

以上是关于最长公共子序列转最大上升子序列(洛谷p1439)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 [p1439] 最长公共子序列 (NlogN)

P1439 模板最长公共子序列

luogu1439 模板最长公共子序列 [动态规划][LIS最长上升子序列][离散化]

[洛谷P1439]排列LCS问题

洛谷P1439 排列LCS问题

LIS&LCS最长上升子序列,最长公共子序列