您的位置:首页 > 其它

uva10635 - Prince and Princess

2016-02-13 11:21 295 查看
题意:

给你两个序列,求最长公共子序列。

思路:

直接LCS会超时,所以将其转为LIS,即将其中一个序列转为单调递增的序列,再遍历,不断更新直至最长。

代码如下:

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

const int N = 90000;

int n, m, k, ha
, a
, dp
;

int main() {
int cas, index = 0;
scanf("%d", &cas);
while (cas--) {
memset(ha, 0, sizeof(ha));
memset(a, 0, sizeof(a));
memset(dp, 0, sizeof(dp));
scanf("%d%d%d", &n, &m, &k);
m++; k++;
int i,cur;
for (i = 1; i <= m; i++) {
scanf("%d", &cur);
ha[cur] = i;
}
for (i = 1; i <= k; i++)
scanf("%d", &a[i]);

int cnt = 0, j;
for (i = 1; i <= k; i++) {
if (!ha[a[i]])//不存在
continue;
int flag = 1;
for (j = 0; j < cnt; j++) {
if (ha[a[i]] < ha[dp[j]]) {
dp[j] = a[i];
flag = 0;
break;
}
}
if (flag)
dp[cnt++] = a[i];

}
printf("Case %d: %d\n", ++index, cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: