【LeetCode】动态规划—1035. 不相交的线(附完整Python/C++代码)

动态规划—1035. 不相交的线

  • 题目描述
  • 前言介绍
  • 基本思路
    • 1. 问题定义
    • 2. 理解问题和递推关系
      • 动态规划递推公式:
      • 边界条件:
    • 3. 解决方法
      • 动态规划方法
      • 伪代码:
    • 4. 进一步优化
    • 5. 小总结
  • Python代码
      • Python代码解释总结:
  • C++代码
      • C++代码解释总结:
  • 最终总结

题目描述

在这里插入图片描述

前言介绍

Uncrossed Lines(不相交的线问题) 是一个典型的动态规划问题,它的解法与 最长公共子序列(LCS, Longest Common Subsequence) 非常相似。我们可以把该问题视作两个数组之间的最大匹配问题,其中相同的数字可以连成一条线,而我们要求这些线相互不交叉。通过动态规划来计算两个数组中的最长公共子序列的长度,我们可以有效地解决这个问题。


基本思路

1. 问题定义

给定两个整数数组 nums1nums2,找出它们之间不相交线段的最大数量。一个线段将 nums1[i] 连接到 nums2[j],当 nums1[i] == nums2[j] 时,且这些线段之间不能交叉。

2. 理解问题和递推关系

该问题可以转化为 最长公共子序列(LCS) 问题。在 nums1nums2 中,相同的元素可以看作是一个匹配,并且这些匹配不应相互交叉。最大不相交线段数量就是两个数组中能找到的最长公共子序列的长度。

动态规划递推公式:

定义一个二维数组 dp[i][j],表示 nums1 的前 i 个元素与 nums2 的前 j 个元素之间能连接的最多不相交线段数量。

  1. 如果 nums1[i-1] == nums2[j-1],则有:
    d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i-1][j-1] + 1 dp[i][j]=dp[i1][j1]+1
    这表示我们可以在 nums1[i-1]nums2[j-1] 之间画一条不相交的线段。

  2. 如果 nums1[i-1] != nums2[j-1],则:
    d p [ i ] [ j ] = max ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) dp[i][j]=max(dp[i1][j],dp[i][j1])
    这表示我们可以选择不连接 nums1[i-1]nums2[j-1],但保持之前的最大不相交线段数。

边界条件:

  • dp[0][*] = 0dp[*][0] = 0,因为当其中一个数组为空时,不可能有任何不相交的线段。

3. 解决方法

动态规划方法

  1. 定义 dp[i][j] 表示 nums1 的前 i 个元素与 nums2 的前 j 个元素之间的最大不相交线段数。
  2. 使用递推公式进行状态转移。
  3. 最终,dp[m][n]mn 分别是 nums1nums2 的长度)就是我们需要的最大不相交线段数。

伪代码:

initialize dp array with size (m+1) x (n+1) with 0s
for i from 1 to m:for j from 1 to n:if nums1[i-1] == nums2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return dp[m][n]

4. 进一步优化

  • 该算法的时间复杂度为 O(m * n),可以通过动态规划中的滚动数组优化空间复杂度到 O(n)

5. 小总结

  • 递推思路:通过逐步递推,比较两个数组的元素是否相等,动态规划可以有效解决这个问题。
  • 时间复杂度:时间复杂度为 O(m * n),可以处理中等规模的输入。

以上就是不相交的线问题的基本思路。


Python代码

class Solution:def maxUncrossedLines(self, nums1: list[int], nums2: list[int]) -> int:m, n = len(nums1), len(nums2)# 初始化dp数组,大小为(m+1) x (n+1)dp = [[0] * (n + 1) for _ in range(m + 1)]# 填充dp数组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] + 1else:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])# 返回不相交线段的最大数量return dp[m][n]

Python代码解释总结:

  1. 初始化:创建一个二维数组 dp,大小为 (m+1) x (n+1),用于记录每个位置的最大不相交线段数。
  2. 动态填充:根据 nums1[i-1]nums2[j-1] 的关系,使用递推公式来更新 dp 数组。
  3. 返回结果dp[m][n] 存储了 nums1nums2 的最大不相交线段数。

C++代码

class Solution {
public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size(), n = nums2.size();// 初始化dp数组,大小为(m+1) x (n+1)vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));// 填充dp数组for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {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];}
};

C++代码解释总结:

  1. 初始化:创建一个二维数组 dp,用于存储每个位置的最大不相交线段数。
  2. 动态填充:遍历 nums1nums2,并根据元素的匹配情况更新 dp 数组。
  3. 返回结果:最终 dp[m][n] 即为最大不相交线段数。

最终总结

  • 问题核心:不相交的线问题可以看作两个数组之间的最长公共子序列问题,通过动态规划有效求解。
  • 时间复杂度:时间复杂度为 O(m * n),其中 mn 分别是 nums1nums2 的长度。
  • 空间优化:可以通过滚动数组优化空间复杂度,从 O(m * n) 降低到 O(n)
  • 应用场景:该问题是动态规划与序列匹配的经典问题之一,掌握这一类问题的解法对于解决类似的匹配问题有重要帮助。

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

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

相关文章

大模型时代,程序员当下如何应对 AI 的挑战并迅速成长!!

随着 AI 技术的飞速发展&#xff0c;特别是大模型的出现&#xff0c;传统的程序员角色正在经历深刻的变革&#xff0c;我们不得不重新对自己进行审视和思考。 同时随着 AI 能力的涌现&#xff0c;AI 已经对现有的软件开发模式和程序员的工作模式造成了冲击&#xff0c;并且大语…

BGA封装芯片贴片加工​时需要注意的细节

在进行BGA 芯片贴片加工时&#xff0c;以下是一些需要注意的细节&#xff1a; 1. BGA 芯片储存&#xff1a;要在合适的温度和湿度环境下储存&#xff0c;防止引脚氧化。 2. PCB 焊盘处理&#xff1a;确保焊盘平整、清洁&#xff0c;无氧化和污染。 3. 锡膏印刷&#xff1a;控制…

2024常用10款源代码加密软件推荐!企业必备保护源代码防泄密

在如今信息安全愈发重要的时代&#xff0c;保护源代码免受未经授权的访问和篡改成为了开发者和企业的首要任务之一。源代码是软件的核心&#xff0c;一旦泄露&#xff0c;不仅会造成商业损失&#xff0c;还可能导致安全漏洞的产生。为了应对这些挑战&#xff0c;源代码加密软件…

智能驾驶|迈向智能出行未来,AI如何应用在自动驾驶?

自动驾驶通过人工智能&#xff08;AI&#xff09;、机器学习、传感器融合和实时数据处理&#xff0c;使车辆能够在无需人类干预的情况下自主驾驶。随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;与智能汽车的结合正在成为现代交通运输领域的热潮。无人驾驶…

Python中的help()函数引发错误:追踪错误并提供解决方案

Python 中的 help() 函数通常用于交互式帮助&#xff0c;它可以显示关于模块、类、函数、方法、关键字等的文档说明。一般情况下&#xff0c;help() 函数不会引发错误&#xff0c;但如果你在使用时遇到问题&#xff0c;可能与以下几种常见情况有关。 1、问题背景 在使用 Pytho…

算法:560.和为k的子数组

题目 链接:leetcode链接 思路分析&#xff08;前缀和&#xff09; 注意&#xff1a;我们前面讲过滑动窗口可以处理子数组、子串等问题&#xff0c; 但是在这道题目里面注意数据范围 -1000 < nums[i] < 1000 nums[i]可正可负&#xff0c;区间的和没有单调性&#xff0c;使…

系统特性、自定义特性

特性指的是一种允许程序员向程序添加元数据的语言结构,用于存储程序结构信息的特殊类。比如为类添加元数据就是在类的定义中添加一些额外的信息,这些信息不是类的功能部分,而是描述一些性质,用途等内容。 语法结构:[特性名(参数列表)]。(就是调用特性类的构造函数) 系…

物联网IoT平台 | 物联网IoT平台的定义

物联网IoT平台&#xff1a;定义、发展与应用在当今信息化时代&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;已经成为推动社会进步和产业升级的重要力量。物联网IoT平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;正逐步改变…

食堂校园预约就餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;用户管理&#xff0c;商家管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xf…

【数据集】2023-2011年上市公司企业新质生产力数据(李心茹版本)

一、测算方式&#xff1a;参考《西部论坛》李心茹&#xff08;2024&#xff09;老师的做法&#xff0c;基于数据可获得性对其评价指标进行综合和调整&#xff0c;构建如表 1 所示的企业新质生产力评价指标体系&#xff0c;然后采用熵值法进行测算计算得到“新质生产力”变量&am…

项目管理的完整流程——你知道吗?

一个完整而有效的项目管理流程&#xff0c;能够确保项目按时、保质、保量地完成&#xff0c;实现客户与领导的双赢。那么&#xff0c;项目管理的完整流程究竟是什么呢&#xff1f; 一、启动 项目启动阶段如同大厦的根基&#xff0c;至关重要。 在这个阶段&#xff0c;需要制定…

【日记】强烈地意识到了:她对我而言,真的很重要

写在前面 2164 字 | 情感内容 | 亲密关系 | HSP | 暴言注意 正文 最安静的一集。今天所有客户经理都出差去了。一楼只有我、柜面主管、前台和门卫四个人。两个小时没人说一句话。 社恐天堂。 工作上没什么好说的。 中午明明人很少&#xff0c;但是食堂阿姨做了很多菜&#xff0…

selenium工具的几种截屏方法介绍(9)

在使用selenium做自动化的时候&#xff0c;可以对于某些场景截图保存当时的执行情况&#xff0c;方便后续定位问题或者作为一些证据保留现场。 获取元素后将元素截屏 我们获取元素后&#xff0c;使用函数screenshot将元素截屏&#xff0c;参数filename传入完整的png文件名路径…

MySQL 【数字】函数大全(一)

ABSCEILCEILINGCONVDIVFLOORCREATESTLEAST 1、ABS ABS(number) &#xff1a;返回指定数字的绝对值 如果参数 number 为字符串&#xff0c;ABS() 将按照如下规则尝试转为数字&#xff1a; 如果以数字开头&#xff0c;则将开头的数字部分转为数字。如果不能转为数字&#xff0c;…

2024最新CKA 认证考试升级计划通知

CKA&#xff08;Certified Kubernetes Administrator&#xff09;是由 Linux 基金会和云原生计算基金会&#xff08;CNCF&#xff09;共同创建的。CKA 认证是他们不断发展 Kubernetes 生态系统工作中不可或缺的一部分。 CKA 认证考试2024升级计划将于在2024年11月25日之后进行…

Triton矩阵乘

目的是计算分块之后的结果c矩阵的一小块。 c矩阵的一小块需要a矩阵的一行和b矩阵一列。 上述两种计算c小块顺序会影响缓存的命中率&#xff0c;所以官方文档的意思就是我们试图让代码运行按照下方的顺序进行矩阵乘法。 所以当分块完毕之后&#xff0c;每个块任务需要加载a的…

AI开源项目

开源AI知识库 FastGPT FastGPT是一个基于LLM&#xff08;大型语言模型&#xff09;的知识库问答系统项目&#xff0c;以下是对FastGPT项目的详细解释&#xff1a; 一、项目背景与团队 FastGPT由FastAI团队开发&#xff0c;该团队包含多位在机器学习和自然语言处理领域具有丰富…

探索光耦:光耦——电动自行车安全与智能的坚实保障

随着电动自行车市场的蓬勃发展&#xff0c;如何提升其安全性、可靠性和智能化水平已成为行业关注的焦点。在众多关键元件中&#xff0c;光电耦合器&#xff08;简称光耦&#xff09;正以其独特的功能&#xff0c;成为电动自行车设计中的关键角色。下面&#xff0c;让我们一同探…

C++与Java Web开发的对比分析:优势与差异

目录 1. 引言 2. C的开发优势与特点 2.1 高性能与硬件控制 2.2 面向对象与多范式支持 2.3 跨平台能力 3. Java Web的开发优势与特点 3.1 跨平台与广泛的企业应用 3.2 丰富的生态系统与工具支持 3.3 安全性与稳定性 4. C与Java Web的差异对比 4.1 性能与效率 4.2 开发…

百度智能云新一代云原生产品加速 AI 原生应用落地

本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 今天为大家分享在过去的一年里&#xff0c;围绕 AI 原生的大背景下&#xff0c;百度智能云在基础公有云的计算、存储、网络以及云原生等产品和技术方面所做出的核心工作。 随着大模型所带来的 AI 技术的代际演化&…