Prince and Princess UVA - 10635 动态规划+优化

问题

https://vjudge.net/problem/UVA-10635

分析

动态规划+优化
首先是LCS,但是如果不进行优化,时间复杂度太高。 由于A或者B中不会出现重复的数字,于是,对于A[i],进行编号,同时将B转化为对应的编号,LCS转化为LIS问题。时间复杂度O(nlogn)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=70000+5,Inf=0x3f3f3f3f;
int n,p,q,ai[maxn],g[maxn],kase=0,T,t,t2;
int main(void){
    scanf("%d",&T);
    while(kase<T){
        scanf("%d%d%d",&n,&p,&q);
        memset(ai,0,sizeof(ai));
        for(int i=1;i<=p+1;++i){
            scanf("%d",&t);
            ai[t]=i;
        }
        int ans=0;
        fill(g,g+q+10,Inf);
        for(int i=1;i<=q+1;++i){
            scanf("%d",&t);
            if(ai[t]){
                int k=lower_bound(g+1,g+q+2,ai[t])-g;
                ans=max(ans,k);
                g[k]=ai[t];
            }
        }
        printf("Case %d: %d\n",++kase,ans);  //编号从1到n
    }
    return 0;
}
发布了180 篇原创文章 · 获赞 3 · 访问量 3473

猜你喜欢

转载自blog.csdn.net/zpf1998/article/details/104777763