首页 > 其他分享 >动态规划:不相交的线

动态规划:不相交的线

时间:2024-08-21 13:51:15浏览次数:7  
标签:连线 元素 相交 tails dp 动态 规划 nums1 nums2

目录

题目

思路

解题过程

复杂度

code 


题目

        在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足:

  •  nums1[i] == nums2[j]
  • 且绘制的直线不与任何其他连线(非水平线)相交。

        请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。

示例 1:

输入:nums1 = [1,4,2], nums2 = [1,2,4]
输出:2
解释:可以画出两条不交叉的线,如上图所示。 
但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。

示例 2:

输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
输出:3

示例 3:

输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
输出:2

提示:

  • 1 <= nums1.length, nums2.length <= 500
  • 1 <= nums1[i], nums2[j] <= 2000

思路

         这个问题可以通过动态规划解决,具体方法是最长递增子序列(LIS)问题的变体。我们的目标是找出nums1nums2中相同元素的最大匹配数,同时保证匹配的线段不会相交。这个问题可以转化为在nums2中为nums1中的每个元素找到一个位置,使得所有找到的位置在nums2中是递增序列。


解题过程

  1. 初始化:创建一个列表tails,其长度与nums2中不同元素的数量相同,初始值设为-1。这个列表将保存每个元素最后出现的位置。

  2. 填充tails:遍历nums2,对于每个元素,如果它在tails中尚未出现,则在tails的末尾添加它的位置;如果已出现,则更新该元素在tails中的值为当前位置。

  3. 计算最长不下降子序列:遍历nums1,对于每个元素,检查它在tails中的位置。如果tails中对应的位置不是-1,说明可以与nums1中的当前元素匹配,更新答案长度。

  4. 返回答案:最终,答案即为nums1中可以找到的最长不下降子序列的长度。


复杂度

  • 时间复杂度:O(n×m),其中nnums1的长度,mnums2的长度。我们需要遍历nums1nums2各一次。
  • 空间复杂度:O(m),最多需要存储nums2中不同元素数量的索引,这个数量不会超过m

code 

class Solution(object):
    def maxUncrossedLines(self, nums1, nums2):
        m, n = len(nums1), len(nums2)
        # 初始化动态规划表
        dp = [[0] * (n + 1) for _ in range(m + 1)]

        # 填充动态规划表
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if nums1[i - 1] == nums2[j - 1]:
                    # 如果当前元素相等,可以建立一条新的连线
                    dp[i][j] = dp[i - 1][j - 1] + 1
                else:
                    # 如果不相等,不能建立新的连线,取两个子问题的较大值
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

        # 返回动态规划表的最后一个元素
        return dp[m][n]

 

标签:连线,元素,相交,tails,dp,动态,规划,nums1,nums2
From: https://blog.csdn.net/Sxiaocai/article/details/141391688

相关文章

  • 【CSP:202312-1】仓库规划(Java)
    题目链接202312-1仓库规划题目描述求解思路暴力求解:由于数据量较小,对每个仓库进行遍历求解即可。需要注意只有一个仓库的特殊情况。(n=1......
  • [Lgxの归纳] 动态规划算法
    参考文章:dp题方法总汇-YeahPotato组合问题选讲-command_block前言2023NOI大纲中,写明了动态规划入门算法为四级难度,属于CSP-J的考察范围。在联合省选2024中,D1T3/D2T1/D2T2,以及NOI2024中,D1T2/D2T2都以不同的形式考察了动态规划算法。甚至在IOI含金量最高......
  • QT+OpenGL创建一个三角形并动态改变三角形颜色
    一、概述需求:1.使用QT+OpenGL创建一个三角形2.默认三角形为黑色3.可以通过点击按钮改变三角形颜色值(红绿蓝)4.如下图所示ps:这一篇用的是QT封装好的opengl相关帮助类,下一篇会用原生的来写。 二、代码示例1.让......
  • 前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size
    使用rem单位与动态设置html的font-size前言随着设备尺寸的多样化,网页需要能够在不同大小的屏幕上提供良好的用户体验。传统的布局方式(如使用px)在不同分辨率下可能会导致布局失真。为了解决这个问题,我们可以通过动态设置html元素的font-size并使用rem单位来构......
  • 【Oracle】存储过程中将动态SQL的多行结果进行循环遍历
    【Oracle】存储过程中将动态SQL的多行结果进行循环遍历需求背景:有一段拼接出来的动态SQL,结果为多行,需要在函数或者存储过程中将其结果作为游标中的数据循环遍历出来以便后续数据操作使用动态SQL和隐式游标隐式游标不支持动态SQL的直接使用,但是可以通过EXECUTEIMMEDIATE来执行......
  • Elementui-Plus动态渲染图标icon
    一、在main.ts引入相关依赖:import*asElementPlusIconsVuefrom'@element-plus/icons-vue'for(const[key,component]ofObject.entries(ElementPlusIconsVue)){app.component(key,component)}二、使用component组件进行动态加载<componentclass="icons&qu......
  • [C语言]-基础知识点梳理-动态内存管理
    前言各位师傅大家好,我是qmx_07,今天给大家讲解动态内存管理的相关知识,下一章节更新文件管理部分的知识点为什么要进行动态内存分配intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间上述的开辟空间的⽅式有两个特点:空......
  • WPF:静态、动态资源以及资源词典
    WPF:静态、动态资源以及资源词典静态资源与动态资源我们常常会使用样式或者控件模板放在Window.Resources中,比如这样:静态资源与动态资源使用如下:<Window.Resources><SolidColorBrushx:Key="SolidColor"Color="#FF0000"/></Window.Resources><Grid><StackPanel......
  • 【配送路径规划】遗传算法GA求解应急物资配送路径(VRP)问题(目标函数:最低成本)【含Matlab
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 【2025毕设热门选题】《基于SpringBoot+Vue的校园资产管理系统》功能规划和开题报告
    博主介绍:8年资深码农、211小硕,全网10万+粉丝。文科生转码,所以非常懂小白学习历程。java领域优质创作者,擅长小白基础课程教学和项目讲解辅导。专注于Java技术领域和大学生毕业项目实战讲解已经5年,服务10000+小白客户。技术范围:自己手撸SpringBoot、Vue、javaweb网站、小程......