rt,初学dp,很多地方弄不太懂
大体的思路是用一个数组表示第一个数组中第i个元素在第二个数组中的位置,然后寻找这个数组的最大上升子序列
最后得了50分,有5个tle
#include <bits/stdc++.h>
using namespace std;
int a[100010] = {0}, b[100010] = {0}, c[100010] = {0},surch[100010] = {0};
int link[100010] = {1};
void dp(int x, int y) {
for (int i = x + 1; i <= y; i++) {
if (surch[x] < surch[i]) {
if (link[x] + 1 > link[i]) {
link[i] = link[x] + 1;
dp(i, y);
}
}
}
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i] ;
}
for (int i = 1; i <= n; i++) {
cin >> b[i] ;
c[b[i]] = i;
}
for (int i = 1; i <= n; i++) {
surch[i] = c[a[i]];
}
for (int i = 1; i <= n; i++) {
link[i] = 1;
}
for (int i = 1; i <= n; i++) {
if (link[i] == 1) {
dp(i, n);
}
}
int max = link[0];
for (int i = 1; i <= n; i++) {
if (link[i] > max)
max = link[i];
}
cout << max;
}