您的位置:首页 > 其它

UVA 10635 Prince and Princess

2014-04-06 16:26 357 查看
题意描述:有两个长度分别为p+1和q+1的序列,每个元素中的各个元素互不相同。都是1~n^2之间的整数,求A和B的最长公共子序列。(2<=n<=250,1<=p,q<=n^2)

分析:本题是LCS问题,但因为p和q可以高达250^2=62500,O(pq)的算法显然太慢。注意到A序列中所有元素互不相同,因此可以把A中的元素重新编号为1~p+1。这样新的A和B的LCS实际上就是B的LIS。可以在O(nlogn)时间内解决。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=251*251;
const int INF=1000000000;
int s[maxn],g[maxn],d[maxn];
int num[maxn];

int main()
{
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
int N,p,q,x;
scanf("%d %d %d",&N,&p,&q);
memset(num,0,sizeof(num));
for(int i=1;i<=p+1;i++) {scanf("%d",&x);num[x]=i;}
int n=0;
for(int i=0;i<q+1;i++) {scanf("%d",&x);if(num[x]) s[n++]=num[x];}
for(int i=1;i<=n;i++) g[i]=INF;
int ans=0;
for(int i=0;i<n;i++)
{
int k=lower_bound(g+1,g+1+n,s[i])-g;
d[i]=k;
g[k]=s[i];
ans=max(ans,d[i]);
}
printf("Case %d: %d\n",kase,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: