题目大意:求出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; }