• AcWing夏季每日一题--最长公共子序列


    https://www.acwing.com/problem/content/3513/

     其中一个串不重复是公共子序列问题转换为上升子序列问题的一个充要条件。

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N = 1e6+10;
    int q[N],id[N];
    int main()
    {
        int n;
        cin>>n;
        memset(id,-1,sizeof id);
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            id[x]=i;
        }
        int tt=0;
        q[0]=-1;
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            int k=id[x];
            if(k==-1) continue;
            int l=0,r=tt;
            while(l<r){//找到小于k的最大的
                int mid=l+r+1>>1;
                if(q[mid]>=k) r=mid-1;
                else l=mid;
            }
            q[r+1]=k;
            tt=max(tt,r+1);
        }
        cout<<tt<<endl;
        return 0;
    }
  • 相关阅读:
    POJ 3009
    POJ 3253
    POJ 3617
    POJ 3984
    UVA10012
    HDU5100
    HDU 5101
    UVA301 运输
    UVA 331 交换的方案数
    uva 10344 算23点
  • 原文地址:https://www.cnblogs.com/greenofyu/p/14791463.html
Copyright © 2020-2023  润新知