这题的思路同LIS问题(朴素DP + 贪心优化 + 最优解记录)的贪心优化or二分优化,即使用一个单调增加的数组 \(res\) 记录 \(a_i\) 在 \(b\) 数组的下标情况,所以暂时先放一个代码,之后有空再补详细题解(誒,懒狗
代码实现
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<utility>
#include<map>
#define INF 1e9
#define inf -1e9
#define PII pair<int, int>
typedef long long ll;
using namespace std;
const int N = 1e5 + 10;
const int mod = 998244353;
map<int, int> mp;
int n;
int a[N], b[N];
int res[N];
int f[N];
int idx;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) {
cin >> b[i];
mp[b[i]] = i;
}
for (int i = 1; i <= n; i++) res[i] = INF;
for (int i = 1; i <= n; i++) {
int p = lower_bound(res + 1, res + 1 + n, mp[a[i]]) - res;
res[p] = mp[a[i]];
if (p > idx) idx = p;
}
cout << idx << endl;
}