您的位置:首页 > 其它

uva 10635 Prince and Princess (将LCS 转化为 LIS)

2014-01-17 12:21 483 查看
关键在于把两个序列中共同出现过的元素 在 第一个序列中出现的序号记下来,

存在数组b中,然后找b的LIS。

可以用二分查找 来排序,也可以用插入排序边插入序号边比较找出最大长度。

STL的运用:

iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。

iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。

需要包含头文件<algorithm>

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 255
#define INF 0xffffff
using namespace std;

int num[maxn*maxn],b[maxn*maxn];
int f[maxn*maxn],dp[maxn*maxn];

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