您的位置:首页 > 其它

UVA 10635 Prince and Princess (最长公共子序列+最长上升子序列)

2016-05-10 22:35 513 查看
题目大意:

    给定两串数字序列,每串数字都不重复,求两串序列的最长公共序列。

解题:

    求两序列的复杂度为n^2,可以转换为求构造后的序列的最长上升子序列,复杂度转换为Nlog(N)。可以参考这篇博客LCS最长公共子序列

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int pos[70000],a[70000],b[70000],arr[70000],val[70000],d[70000],cnt,len;
int binary_search(int i)
{
int left,right,mid;
left=0,right=len;
while(left<right){
mid = left+(right-left)/2;
if(d[mid]>=arr[i]) right=mid;
else left=mid+1;
}
return left;
}
int LIS()
{
d[1] = arr[1];
len=1;
for(int i=2; i<cnt; ++i)
{
if(arr[i]>d[len])
d[++len]=arr[i];
else{
int p=binary_search(i);
d[p] = arr[i];
}
}
return len;
}
int main()
{
int t,x,m,n;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
cnt=1;
memset(pos,-1,sizeof(pos));
scanf("%d%d%d",&x,&m,&n);
for(int j=1;j<=m+1;j++)
scanf("%d",&a[j]);
for(int j=1;j<=n+1;j++)
scanf("%d",&b[j]);

for(int j=1;j<=n+1;j++)
pos[b[j]]=j;

for(int j=1;j<=m+1;j++)
{
if(pos[a[j]]!=-1)
arr[cnt++]=pos[a[j]];
}
printf("Case %d: %d\n",i,LIS());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva