您的位置:首页 > 其它

UVA 10635 Prince and Princess——LIS

2018-03-07 16:56 330 查看
乍一看以为是LCS, 但是pq复杂度太高,不过题目中每个序列里的所有元素都不同,根据这一点我们可以遍历数组p,另vis【p【i】】=i,相当于给p中每个元素映射上一个编号,这些编号代表他们的遍历顺序。然后遍历q,根据vis数组将vis【p【i】】提取到新数组a中,然后在a中求一遍LIS就好了(仔细想一想就想到了,不解释了)#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5;
const int INF = 0x3f3f3f3f;
int T, N, P, Q, p[maxn], q[maxn], vis[maxn], n, a[maxn], dp[maxn];
int main() {
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d %d %d", &N, &P, &Q); P++; Q++;
for (int i = 0; i < P; i++) scanf("%d", &p[i]);
for (int i = 0; i < Q; i++) scanf("%d", &q[i]);
memset(vis, -1, sizeof(vis));
for (int i = 0; i < P; i++) vis[p[i]] = i+1;
n = 0;
for (int i = 0; i < Q; i++) {
if (vis[q[i]] == -1) continue;
a[n++] = vis[q[i]];
}
memset(dp, INF, sizeof(dp));
for (int i = 0; i < n; i++) *lower_bound(dp, dp+n, a[i]) = a[i];
printf("Case %d: %d\n", kase, lower_bound(dp, dp+n, INF) - dp);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: