最长公共子序列(上海交通大学考研机试题)

这篇具有很好参考价值的文章主要介绍了最长公共子序列(上海交通大学考研机试题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

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

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

输入样例

5
2 1 3 8 7
2 9 3 4 5

输入样例

2

数据范围

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

分析

此题的数据量达到了1e6故不能用传统的 o ( n 2 ) o(n^2) o(n2)的dp做法,需考虑 o ( n l o g n ) o(nlogn) o(nlogn)的做法。
由于第一个序列中元素不重复,这是一个典型的最长公共子序列转换为最长上升子序列问题。


最长上升子序列求法 O ( n l o g n ) O(nlogn) O(nlogn)

首先我们看看最长公共子序列的求解过程是什么样子的?

A: 2 1 3 8 7
B: 2 9 3 4 5

ans = {2, 3};

就是从B中按照下标从小到大的顺序(从左至右)去A中找相同的数字,且在A中数字的下标也需要是递增的(也需要从左至右)

我们用另一种方式模拟这个过程

① 我们先将A中的数字和下标存储在idx数组中idx[key] = value,key 对应的是A中的值,value对应的是A中元素值对应的下标;

② 再按照坐标序遍历B中的元素,找到其在A中的位置idx[key], 找到一个我们就处理这个元素的下标到f数组中,将f数组维护为递增数组(刚刚我们说到A,B的子序列下标都需要是递增的);

f 数组维护的是B数组元素在A数组元素中的下标

时间复杂度

O ( n l o g n ) O(nlogn) O(nlogn)文章来源地址https://www.toymoban.com/news/detail-705854.html

C++ 代码
#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 7;

int idx[N], f[N];
int cnt;
int n;

int find(int x) {
    int l = 0, r = cnt;
    while (l < r) {
        int mid = l + r >> 1;
        if (f[mid] >= x) r = mid;
        else l = mid + 1;
    }
    
    return l;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n;
    memset(idx, -1, sizeof idx);
    
    for (int i = 1; i <= n; i ++ ) {
        int x;
        cin >> x;
        idx[x] = i;     // 记录数组中每个值的下标是多少
    }
    
    
    for (int i = 1; i <= n; i ++ ) {
        int x;
        cin >> x;
        
        int k = idx[x];
        if (k == -1) continue;
        
        if (k > f[cnt]) f[ ++ cnt ] = k;    // 如果当前下标大于f数组末尾元素下标就直接加入f数组
        else {
            int p = find(k);    // 找到大于等于k的第一个数的下标
            f[p] = k;           // 将下标的对应值替换掉
        }
    }
    
    cout << cnt << endl;
    return 0;
}

到了这里,关于最长公共子序列(上海交通大学考研机试题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【智能车】上海交通大学AuTop战队开源算法提纲备忘

    【智能车】上海交通大学AuTop战队开源算法提纲备忘

    本文是作者在学习上海交通大学AuTop战队开源算法时列的提纲备忘,并做了很多资料的链接,像是一个目录,分享给大家一起学习, 如有侵权,联系删除; 参考:https://github.com/SJTU-AuTop 1. 固定阈值二值化 2. 大津法(OTSU)阈值 3. 自适应阈值 总结: 1. “迷宫法”进行边线提取

    2024年02月02日
    浏览(6)
  • 新中特复习笔记二——章节整理上(上海交通大学)

    本文根据复习ppt整理,猜测考点与题型均为老师的个人猜测,不做保证。感觉很多知识点重在理解,大家有空可以把对应的前后文看看!祝大家身体健康,考试顺利!!💯 ps:本文是博主复🐏初愈下整理的,脑子感觉不太好,可能有很多遗漏或者错误的地方,欢迎大家指出

    2024年02月03日
    浏览(5)
  • 上海交通大学电院夏令营直博保姆级攻略

    目录 写在前面 个人情况 报名【5月25日至6月26日】 面试【7月9日or7月10日】 面试结果通知与双选竞争【8月1日至9月初】 双选的一些TIPS 福(广)利(告)时间:Top1%室友的保研大宝箱! 本攻略主要是对2022年上海交通大学夏令营从报名到成功上岸与老师双选经验的记录。所有流

    2024年02月15日
    浏览(6)
  • 体验文心一言AI大模型生成伊利诺伊大学香槟分校、复旦大学、上海交通大学、东南大学和加州伯克利大学简介

    体验文心一言AI大模型生成伊利诺伊大学香槟分校、复旦大学、上海交通大学、东南大学和加州伯克利大学简介

    UIUC(University of Illinois at Urbana-Champaign)是美国伊利诺伊大学香槟分校的简称。该学校成立于1868年,位于美国伊利诺伊州香槟市,是一所公立研究型大学。UIUC是美国著名的常春藤盟校之一,在多个学科领域享有声誉,包括工程、商科、建筑、心理学、法学、医学、农学等。

    2024年02月11日
    浏览(16)
  • 跑通GICI-LIB——上海交通大学开源GNSS/INS/Camera组合导航库

    跑通GICI-LIB——上海交通大学开源GNSS/INS/Camera组合导航库

    GICI-LIB是由上海交通大学池澄博士开源的GNSS/INS/Camera组合导航库 GICI-LIB原文链接:C. Chi, X. Zhang, J. Liu, Y. Sun, Z. Zhang, and X. Zhan, \\\"GICI-LIB: A GNSS/INS/Camera Integrated Navigation Library,\\\" arXiv preprint, arXiv:2306.13268.  https://doi.org/10.48550/arXiv.2306.13268. GICI-LIB有以下几个特点: 基于 因子图优化(

    2024年02月08日
    浏览(9)
  • 最长公共子序列和最长公共子串

    最长公共子序列 题目描述 给出1,2,…, n 的两个排列P 1 和 P 2 ,求它们的最长公共子序列。 输入格式 第一行是一个数 n 。 接下来两行,每行为 n 个数,为自然数1,2,…, n 的一个排列。 输出格式 一个数,即最长公共子序列的长度。 题目分析 第一阶段定义dp数组 (1)考虑规模

    2024年02月19日
    浏览(6)
  • 最长公共子序列(详细代码 注释 分析 以及求出最长公共子序列内容方法)

    最长公共子序列(详细代码 注释 分析 以及求出最长公共子序列内容方法)

    文章有些长,希望能够耐心看完,并且对你有帮助,文章是自己看了书之后,总结的,如果有什么错误的地方,欢迎指出。 一些基本的概念: 子序列: 原序列中删除若干个元素得到的序列,即原序列中可以不连续的一段 子串: 原序列中任意个连续的序列元素组成的序列,

    2023年04月15日
    浏览(5)
  • 【算法训练-字符串 三】最长公共子串、最长公共子序列

    【算法训练-字符串 三】最长公共子串、最长公共子序列

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【】,使用【】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个地方都出现过才做

    2024年02月09日
    浏览(6)
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出

    2024年02月01日
    浏览(13)
  • 最长公共子序列LCA

    最长公共子序列LCA

    题目链接:3692. 最长连续公共子序列 - AcWing题库

    2024年02月13日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包