UVA - 10635 Prince and Princess

题目大意:求出A串和B串的最长公共子序列。

解题思路:由于数据量比较大,p,q->250^2 = 62500.所以一般的解法是过不了的,在一看题目,发现两两元素各不相同,于是可以把A中元素重新编号为1~p+1。然后去B中找最长上升子序列即可,具体的可以手推一遍。


#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int main() {
	int T, cas = 0, pos[62600], DP[62600] = {0};
	scanf("%d", &T);
	while (T--) {
		int n, p, q, x, cnt = 0;
		scanf("%d%d%d", &n, &p, &q);
		memset(pos, 0, sizeof(pos));
		for (int i = 0; i <= p; i++) {
			scanf("%d", &x);
			pos[x] = i + 1;
		}

		for (int i = 0; i <= q; i++) {
			scanf("%d", &x);
			if (pos[x] > DP[cnt])
				DP[++cnt] = pos[x];
			else
				DP[lower_bound(DP + 1, DP + 1 + cnt, pos[x]) - DP] = pos[x];
		}
		printf("Case %d: %d\n", ++cas, cnt);
	}
	return 0;
}


你可能感兴趣的:(UVA - 10635 Prince and Princess)