[luogu P1439] 【模板】最长公共子序列{最长上升子序列}

[序列]LIS/LCS 专栏收录该内容
11 篇文章 0 订阅

题目

https://www.luogu.org/problemnew/show/P1439


解题思路

对于求 " L C S " "LCS" "LCS"问题的 O ( n ) O(n) O(n)算法很容易可以得到,但是在本道**“模板题”**,这不是正解。
**注意题目给出的是:为自然数1-n的一个排列。**我们可以先将第一个数列离散化一下,设 b e l o n g [ x ] = i belong[x]=i belong[x]=i,原串则变成 1 − 3 , 2 − 2 , 3 − 1 , 4 − 4 , 5 − 5 1-3,2-2,3-1,4-4,5-5 13,22,31,44,55,对于第二个排列,我们可以直接求最长上升子序列即可。


代码

#include<cstdio>
#include<algorithm>
using namespace std; 
const int inf=1e5+1; 
int b[inf],belong[inf],len,n; 
int main()
{
	scanf("%d",&n); int x; 
	for (int i=1;i<=n;i++) scanf("%d",&x),belong[x]=i; 
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&x); 
		if (belong[x]>b[len]) b[++len]=belong[x]; 
			else b[lower_bound(b+1,b+len+1,belong[x])-b]=belong[x]; 
	}
	printf("%d",len); 
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值