• 最长公共子序列(冬季每日一题 5)


    给出两个长度为 n n n 的整数序列,求它们的最长公共子序列 L C S LCS LCS)的长度,保证第一个序列中所有元素都不重复。

    注意:

    • 第一个序列中的所有元素均不重复。
    • 第二个序列中可能有重复元素。
    • 一个序列中的某些元素可能不在另一个序列中出现。

    输入格式
    第一行包含一个整数 n n n

    接下来两行,每行包含 n n n 个整数,表示一个整数序列。

    输出格式
    输出一个整数,表示最长公共子序列的长度。

    数据范围
    1 ≤ n ≤ 1 0 6 , 1≤n≤10^6, 1n106,
    序列内元素取值范围 [ 1 , 1 0 6 ] [1,10^6] [1,106]

    输入样例1:

    5
    1 2 3 4 5
    1 2 3 4 5
    
    • 1
    • 2
    • 3

    输出样例1:

    5
    
    • 1

    输入样例2:

    5
    1 2 3 5 4
    1 2 3 4 5
    
    • 1
    • 2
    • 3

    输出样例2:

    4
    
    • 1

    思路:

    由于 a a a 中元素是唯一的,所以 b b b 中与 a a a 中公共的元素 x x x 一定在 a a a 中对应唯一的位置,可以将 b b b 中元素在 a a a 中出现的位置 记录到 i d id id 数组中(不存在的标记为 -1),此时可以发现,求 a 、 b a、b ab 数组的最长公共子序列就相当于求 i d id id 数组的最长子序列。

    在这里插入图片描述

    #include
    #include
    
    using namespace std;
    
    const int N = 1000010;
    
    int n;
    int id[N], q[N];
    
    int main(){
        
        memset(id, -1, sizeof id);
        scanf("%d", &n);
        int x;
        for(int i = 0; i < n; i++){
            scanf("%d", &x);
            id[x] = i;
        }
        
        int tt = 0;
        q[0] = -1;
        int k;
        for(int i = 0; i < n; i++){
            
            scanf("%d", &x);
            if(id[x] == -1) continue;
            k = id[x];
            
            int l = 0, r = tt;
            while(l < r){
                
                int mid = l + r + 1 >> 1;
                if(q[mid] < k) l = mid;
                else r = mid - 1;
            }
            q[r + 1] = k;
            tt = max(tt, r + 1);
        }
        
        printf("%d\n", tt);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    docker-swarm集群搭建
    算法基础学习|二分
    jvm初识
    Tomcat 的本地部署及 SmartTomcat 的使用
    Go学习第八章——面向“对象”编程(入门——结构体与方法)
    学妹学Java(一)
    Long类型雪花算法ID返回前端后三位精度缺失问题解决
    电脑显示器符合BS 476-7 英国Class 2阻燃测试
    RSA算法中,为什么需要的是两个素数?
    RocketMQ的消费流程及最佳实践
  • 原文地址:https://blog.csdn.net/qq_46456049/article/details/127743669