本文主要是介绍洛谷 P1439 最长公共子序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
给出 1,2,…,n 的两个排列 P1 和 P2 ,求它们的最长公共子序列。
输入格式
第一行是一个数 n。
接下来两行,每行为 n 个数,为自然数 1,2,…,n 的一个排列。
输出格式
一个数,即最长公共子序列的长度。
输入输出样例
输入 #1
5 3 2 1 4 5 1 2 3 4 5
输出 #1
3
说明/提示
- 对于 50% 的数据, n≤10^3;
- 对于 100% 的数据,n≤10^5;
解题思路
最开始基本解法是二维数组O(n^2)解法显然过不了,这里需要把题目转换成求递增子序列,递增子序列需要一个贪心的优化
#include<stdio.h>
int n, a[100001], b[100001], c[100001], t, f[100001];
int main()
{int i;scanf("%d", &n);for (i = 1; i <= n; i++){scanf("%d", &a[i]);c[a[i]] = i;f[i] = 1e9;}for (i = 1; i <= n; i++){scanf("%d", &t);b[i] = c[t];}int len = 1; f[1] = b[1];for (i = 2; i <= n; i++){if (b[i] > f[len])f[++len] = b[i];else{int l = 0, mid, r = len, g;while (l <= r){mid = (l + r) / 2;if (f[mid] >= b[i]){g = i;r = mid - 1;}elsel = mid + 1;}if (f[g] > b[i])f[g] = b[i];}}printf("%d", len);return 0;
}
这篇关于洛谷 P1439 最长公共子序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!