P1439 【模板】最长公共子序列 Python 题解

news2025/1/15 8:36:27

【模板】最长公共子序列

题目描述

给出 1 , 2 , … , n 1,2,\ldots,n 1,2,,n 的两个排列 P 1 P_1 P1 P 2 P_2 P2 ,求它们的最长公共子序列。

输入格式

第一行是一个数 n n n

接下来两行,每行为 n n n 个数,为自然数 1 , 2 , … , n 1,2,\ldots,n 1,2,,n 的一个排列。

输出格式

一个数,即最长公共子序列的长度。

样例 #1

样例输入 #1

5 
3 2 1 4 5
1 2 3 4 5

样例输出 #1

3

提示

  • 对于 50 % 50\% 50% 的数据, n ≤ 1 0 3 n \le 10^3 n103
  • 对于 100 % 100\% 100% 的数据, n ≤ 1 0 5 n \le 10^5 n105

题解

普通的LCS解(会TLE or MLE)

这题最开始我想着模版LCS,所以就默写了一个 真模版 LCS上去,(模版LCS问题这里就不讲了,个人觉得是一种数字三角形的变形题目)

def Solution1():
    N = int(input())
    Nums1 = [0] + list(map(int, input().strip().split()))
    Nums2 = [0] + list(map(int, input().strip().split()))
    dp = [[0 for _ in range(N+1)] for _ in range(N+1)]

    for i in range(1, N+1):
        for j in range(1, N+1):
            dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]+1 if Nums1[i] == Nums2[j] else 0)
    print(dp[N][N])
Solution1()

在这里插入图片描述
我擦,懵了,这特么什么情况,不是模版题吗???

转换成LIS问题

我去查看了几篇题解,这才明白这道题的情况

首先我们看看LIS问题:
举例:

4 5 3 1 6 7 2

求上面这个序列的最长上升子序列

怎么求?
正常的想法就是用最长上升子序列的方法求,贪心解 ( O ( n l o g n ) ) (O(nlogn)) (O(nlogn)),或者dp解 ( O ( n 2 ) ) (O(n^2)) (O(n2)),学过这方面的一般都是懂的,

但是求最长上升子序列问题还有一种思路

求最长上升子序列其实是求最长公共子序列

可能看到这有点懵了
继续举例:

4 5 3 1 6 7 2
1 2 3 4 5 6 7

求上面两个序列的最长公共子序列
我们发现,第一个序列的所有上升子序列,也一定是第二个序列的子序列,因为第二个序列就是1到7的单调排列。故而求最长的上升子序列,也是求最长的公共子序列。也就是说LIS问题可以转换成LCS问题。同理,这种情况的LCS问题也可以转换成LIS问题来解决。那么和这题有什么关系呢?

这题给了这样的一个神奇的限制条件:

接下来两行,每行为 n n n 个数,为自然数 1 , 2 , … , n 1,2,\ldots,n 1,2,,n 的一个排列。

所以两个序列的数字总数一样为n, 而且是1到n的一种排列

举例:

3 2 1 4 5
5 4 3 2 1

我们假设有这样的一种大于小于情况:5<4<3<2<1
欸,那么上面的最长上升子序列就是3 2 1了!!

看明白了吗?
当我们把Nums2中下标小的数字看成小的数,下标大的数字看成大的数,那么Nums2就成了一种单调递增序列,而且是全排列的

所以就把刚刚上面那种情况复原出来了,也就是说LCS问题可以转换成LIS问题来解决。

下面给出关于这题的LIS贪心解(LIS的dp解不行)

def Solution2():
    N = int(input())
    Nums1 = list(map(int, input().strip().split()))
    Nums2 = list(map(int, input().strip().split()))

    # 将Nums2转换成 1 2 ... 13 14 ... 100 101的单调上升序列
    idx = [0 for _ in range(N+1)]
    for i in range(N):
        idx[Nums2[i]] = i + 1

    # 在Nums2中,形式上下标大的数比下标小的数大
    # 转换成求Nums1的最长上升子序列问题

    f = []
    LenF = 0
    for i in range(N):
        left, right = 0, LenF
        # 左闭右开
        while left < right:
            mid = left + right >> 1
            # 如果 形式上 f[mid] < Nums1[i] (在idx上表示就是 idx[f[mid]] < idx[Nums1[i]])
            # 去f的右边找更大的数,直至 形式上 Nums1[i] <= f[mid]
            if idx[f[mid]] < idx[Nums1[i]]:
                left = mid + 1
            else:
                right = mid
        if len(f) <= right:
            f.append(Nums1[i])
            LenF += 1
        else:
            f[right] = Nums1[i]
    print(LenF)
Solution2()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell脚本:分发文件到各个集群节点

找一个全局目录/root/bin 写脚本 touch xsync chmod 777 xsync #!/bin/bash#作者&#xff1a;ldj #时间&#xff1a;2024-10-15 #描述&#xff1a;拷贝文件#1. 判断参数个数 if [ $# -lt 1 ]thenecho "Error: Not Enough Argument!"exit fi#2.遍历集群所有机器 spac…

工业和建筑工地 安全帽-安全带识别数据集 yolo数据集 共2200张 已增强 标注

安全帽-安全带识别数据集 yolo数据集 共2200张 已增强 安全帽检测与安全带识别数据集 图像数量&#xff1a;2,200张增强后标注数量&#xff1a; belt&#xff08;安全带&#xff09;&#xff1a;3,197个head&#xff08;头部&#xff09;&#xff1a;326个helmet&#xff08;安…

asp.net Core 自定义中间件

内联中间件 中间件转移到类中 推荐中间件通过IApplicationBuilder 公开中间件 使用扩展方法 调用中间件 含有依赖项的 》》》中间件 参考资料

数据结构——排序(1)

数据结构——排序(1) 文章目录 数据结构——排序(1)一、排序1.概念&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 2.运用&#xff1a;购物筛选排序&#xff0c;院校排名等。 3.常见排…

业务的合并与分批

1.你中有我&#xff0c;我中有你 2.合久必分&#xff0c;分久必合 3.正负负正&#xff0c;正道无穷

MRI学习笔记-LItool使用教程,计算偏侧化指数lateralization index

偏侧化指数介绍 描述功能偏侧化最常用的方法之一是计算偏侧化指数&#xff0c;分别是左侧和右侧感兴趣区域&#xff08;ROI&#xff09;中值高于特定激活阈值的体素数。因此&#xff0c;LI值的范围从1&#xff08;左主导&#xff09;到1&#xff08;右主导&#xff09;。然而&…

AtCoder Beginner Contest 375 A-E 题解

我的老师让我先做最后再交&#xff0c;看正确率&#xff08;即以OI赛制打abc&#xff09; 所以我用的小号&#xff08;… …&#xff09; C 卡了老半天才出来&#xff0c;我把题读错了 难度&#xff1a; A. Seats 题意 给你一个字符串 S S S&#xff0c;仅包含 . 和 #&…

unity 调整skinweight (皮肤权重),解决:衣服穿模问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、skinweight 是什么&#xff1f;二、代码控制&#xff1a;可根据平台切换1.引入库 总结 前言 最近遇到一个问题&#xff0c;人物模型的衣服穿模&#xff08…

本地拉取Docker镜像打包导入远程服务器

起因是因为使用远程服务器拉取镜像时&#xff0c;由于网络问题一直拉不成功&#xff0c;使用国内镜像由于更新不及时&#xff0c;国内镜像没有最新的 docker 镜像。最后使用本地的计算机&#xff0c;通过代理下载最新的镜像后打包成 tar&#xff0c; 然后上传到远程服务器进行导…

interwirelessac9560感叹号,电脑无法连接wifi,无法搜索到wifi

interwirelessac9560感叹号 电脑无法连接wifi&#xff0c;无法搜索到wifi 原因 这可能是wifl模块出现了问题。 解决方案 1、winx 打开&#xff0c;选择【设备管理器】 2、选择网络适配器 右键打开wireless-AC&#xff0c;选择【卸载设备】。 3、关机2分钟后&#xff0c…

计算机网络-VRRP实验配置

前面我们大致学习了VRRP的概念和基本原理&#xff0c;但是网络这块就是要多敲命令多用才能印象深刻&#xff0c;今天开始进行一些实验配置&#xff0c;结合日常工作的场景分析VRRP在实际工作中的应用。 一、典型VRRP虚拟网关拓扑 相比于传统单网关&#xff0c;采用VRRP虚拟网关…

Forward Chaining(前向链推理)

这是一个 Forward Chaining&#xff08;前向链推理&#xff09; 的例子&#xff0c;用于在给定的命题逻辑规则集下&#xff0c;从已知的事实推导出新结论。图示右侧显示了推理过程的依赖关系图&#xff0c;左侧是规则和初始事实。 我们有以下命题逻辑规则和已知的事实&#xf…

几种常用大模型工具生成基于hi3861的OpenHarmony代码的尝试

引言 最近在上智能物联网的课程&#xff0c;讲授基于hi3861的OpenHarmony编程&#xff0c;所以尝试一下使用大模型工具生成相关的代码&#xff0c;看看效果如何。提问的方式比较简单粗暴&#xff1a; 在OpenHarmony的hi3861平台上&#xff0c;如何编程访问https的网站&#xf…

iOS 打包/导出时提示图标错误,缺少某个规格的图标

Asset validation failed Missing required icon file. The bundle does not contain an app icon for iPad of exactly ‘167x167’ pixels, in .png format for iOS versions supporting iPad Pro. To support older operating systems, the icon may be required in the bun…

唐寅,风流倜傥的艺术天才

唐寅&#xff0c;字伯虎&#xff0c;号六如居士&#xff0c;生于明宪宗成化六年&#xff08;公元1470年&#xff09;&#xff0c;卒于明世宗嘉靖二十三年&#xff08;公元1524年&#xff09;&#xff0c;享年54岁。他是吴门画派的重要代表人物之一&#xff0c;不仅在绘画方面有…

分享两种安装windows系统教程,学会后再也不需要花钱装系统了。

前期准备工作&#xff1a; 需要一个8G或16G的空U盘需要你安装的系统的镜像文件 一般是一个以 .iso 后缀结尾的文件 2.1 镜像文件获取方式 1&#xff09; 去windows 官网获取 2&#xff09;去 我告诉你 网址下载所需要的镜像文件 这个网址 分享了很多 我们常用的系统 大家可以按…

docker构建jar镜像

文章目录 构建 DockerFile将jar包上传到创建的目录当中在目录中创建 Dockerfile 文件构建镜像创建并启动容器说明 构建 DockerFile [root192 /]# mkdir my [root192 /]# cd my [root192 my]# 将jar包上传到创建的目录当中 在目录中创建 Dockerfile 文件 vi Dockerfile FROM …

RabbitMQ 入门(六)SpringAMQP五种消息类型

一、发布订阅-DirectExchange&#xff08;路由模式&#xff09; 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 Direct Exchan…

共识算法Raft(day11)

引入 在分布式系统中&#xff0c;为了消除单点提高系统可用性&#xff0c;通常会创建副本来进行容错&#xff0c;但这会带来另一个问题就是&#xff0c;如何保证多个副本之间的数据一致性。 为了解决这个问题&#xff0c;计算机行内就提出了共识算法&#xff0c;它允许多个分…

增强对象智能:谷歌开源的XR-Objects项目简介

随着增强现实(AR)技术的发展,将物理世界与数字信息融合的需求日益增长。为了探索这一领域的可能性,谷歌推出了一项名为“增强对象智能”(Augmented Object Intelligence, AOI)的新交互范式,并发布了一个开源原型系统——XR-Objects。该系统旨在通过实时对象分割和多模态…