学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:洛谷刷题C++语言 | 汇总
【题目描述】
给出 1,2,…,n 的两个排列 P 1 P_1 P1 和 P 2 P_2 P2 ,求它们的最长公共子序列。
【输入】
第一行是一个数 n。
接下来两行,每行为 n 个数,为自然数 1,2,…,n 的一个排列。
【输出】
一个数,即最长公共子序列的长度。
【输入样例】
5
3 2 1 4 5
1 2 3 4 5
【输出样例】
3
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, a[N], b[N], m[N];
set<int> dp;
set<int>::iterator it;
int main()
{
cin >> n;
for (int i=1; i<=n; i++) {
cin >> a[i];
m[a[i]] = i; //a数组中的数字是在第几个位置出现
}
for (int i=1; i<=n; i++) cin >> b[i];
dp.insert(m[b[1]]);
for (int i=2; i<=n; i++) {
it = dp.lower_bound(m[b[i]]);
if (it!=dp.end())
dp.erase(it);
dp.insert(m[b[i]]);
}
cout << dp.size();
return 0;
}
【运行结果】
5
3 2 1 4 5
1 2 3 4 5
3