这题是个LCS和LIS的综合。
可以设表示当前到A串的位置
,B串的位置
,且当前的LCIS的最后一个数是
。
则有转移方程
转移的时候发现对于当前的位置,
是固定的,所以其实转移集合是固定的,只会增大而不会减小。
那么可以直接对可转移集合维护一个,那么就可以
解决这个问题了。
#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
int n, a[N], b[N];
int f[N][N];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for(int i = 1; i <= n; ++i) scanf("%d", &b[i]);
for(int i = 1; i <= n; ++i) {
int v = 0;
for(int j = 1; j <= n; ++j) {
if(a[i] == b[j]) f[i][j] = v + 1;
else f[i][j] = f[i - 1][j];
if(b[j] < a[i]) v = max(v, f[i][j]);
}
}
int ans = 0;
for(int i = 1; i <= n; ++i) ans = max(ans, f[n][i]);
printf("%d\n", ans);
} 
京公网安备 11010502036488号