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

来源:互联网 发布:php 双轨直销系统 编辑:程序博客网 时间:2024/04/27 09:58

关键在于把两个序列中共同出现过的元素 在 第一个序列中出现的序号记下来,

存在数组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 0xffffffusing 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;}




0 0
原创粉丝点击