第九章 动态规划 part14 1143. 最长公共子序列 1035. 不相交的线 53. 最大子序和

news2025/1/14 0:43:35

第五十六天| 第九章 动态规划 part14 1143. 最长公共子序列 1035. 不相交的线 53. 最大子序和

一、1143. 最长公共子序列

  • 题目链接:

  • 题目介绍:

  • 思路:

    • 本题和“最长重复子数组”区别在于**这里不要求是连续的了,但要有相对顺序**,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。

    • dp五部曲:

      • (1)确定dp数组及下标含义:

        • dp[i][j]:表示的是以下标i-1为结尾的text1和以下标j-1为结尾的text2的最长公共子序列的长度
          
      • (2)确定递推公式:

        • 本题不再要求连续,因此dp[i][j]可以由三个方向推出
          
        • 如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;
          
          如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。
          
          即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
          
        • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      • (3)初始化dp数组:

        • 根据dp数组的含义,char1[0, i-1]和空数组的公共子序列长度为0;同理,char2[0, j-1]和空数组的公共子序列长度也为0。因此,dp[i][0] = 0,dp[0][j] = 0。其他位置在后续均可以覆盖,因此都初始化为0。
          
      • (4)确定遍历顺序:

        • 根据递推公式可知是正序
    • 和重复子数组(连续公共子序列)不同,本题的最终结果是在二维dp数组的最右下角,因为根据递推公式,如果不相同还是会根据左边的和上边的推导出来。

  • 代码:

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        char[] char1 = text1.toCharArray();
        char[] char2 = text2.toCharArray();
        // (1)确定dp数组及下标含义
        // dp[i][j]:表示的是以下标i-1为结尾的text1和以下标j-1为结尾的text2的最长公共子序列的长度
        int[][] dp = new int[char1.length + 1][char2.length + 1];
        // (3)初始化dp数组
        // 根据dp数组的含义,char1[0, i-1]和空数组的公共子序列长度为0;同理,char2[0, j-1]和空数组的公共子序列长度也为0。因此,dp[i][0] = 0,dp[0][j] = 0。其他位置在后续均可以覆盖,因此都初始化为0。
        // (4)确定遍历顺序
        // 根据递推公式可知是正序
        for (int i = 1; i <= char1.length; i++) {
            for (int j = 1; j <= char2.length; j++) {
                // (2)确定递推公式
        		// 本题不再要求连续,因此dp[i][j]可以由三个方向推出
                if (char1[i-1] == char2[j-1]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }
        // 和重复子数组(连续公共子序列)不同,本题的最终结果是在二维dp数组的最右下角,因为根据递推公式,如果不相同还是会根据左边的和上边的推导出来。
        return dp[char1.length][char2.length];
    }
}

二、1035. 不相交的线

  • 题目链接:https://leetcode.cn/problems/uncrossed-lines/

  • 题目介绍:

    • 在两条独立的水平线上按给定的顺序写下 nums1nums2 中的整数。

      现在,可以绘制一些连接两个数字 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 的直线相交。
      
  • 思路:

    • 套壳的“最长公共子序列”
    • 思路和解法与上道题目是一样的
  • 代码:

class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        for (int i = 1; i <= nums1.length; i++) {
            for (int j = 1; j <= nums2.length; j++) {
                if (nums1[i-1] == nums2[j-1]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }
        return dp[nums1.length][nums2.length];
    }
}

三、53. 最大子序和

  • 题目链接:https://leetcode.cn/problems/maximum-subarray

  • 题目介绍:

    • 相关企业

      给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

      子数组 是数组中的一个连续部分。

      示例 1:

      输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
      输出:6
      解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
      
  • 思路:

    • dp五部曲:

      • (1)确定dp数组及下标含义

        • dp[i]:表示的是以nums[i]为结尾的最大连续子序列之和
          
      • (2)确定递推公式

        • dp[i]只能由两个方向推出来:
          	一个是:因为是连续的所以是dp[i-1] + nums[i]
          	另一个是:当前nums[i]
          
      • (3)初始化dp数组

        • dp[0]:表示的是以nums[0]为结尾的最大连续子序列的和,所以dp[0] = nums[0]
          
      • (4)遍历顺序:正序

  • 代码:

class Solution {
    public int maxSubArray(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int result = nums[0];
        // (1)确定dp数组及下标含义
        // dp[i]:表示的是以nums[i]为结尾的最大连续子序列之和
        int[] dp = new int[nums.length];
        // (3)初始化dp数组
        // dp[0]:表示的是以nums[0]为结尾的最大连续子序列的和,所以dp[0] = nums[0].
        dp[0] = nums[0];
        // (4)遍历顺序:正序
        for (int i = 1; i < nums.length; i++) {
            // (2)确定递推公式
            // dp[i]只能由两个方向推出来:
            //     一个是:因为是连续的所以是dp[i-1] + nums[i]
            //     另一个是:当前nums[i]
            dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
            if (dp[i] > result) result = dp[i];
        }
        return result;
    }
}

总结:

  • 子数组:求解的就是**连续子序列**
  • 子序列:没有强调的连续,只要是子序列即可

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

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

相关文章

安防监控用品经营商城小程序搭建

安防监控产品种类很多&#xff0c;如监控摄像头、烟感、机房系统、对讲机等&#xff0c;虽然不是每个家庭都需要&#xff0c;但却占据着市场不小份额&#xff0c;其应用度也非常广泛&#xff0c; 而在实际销售方面&#xff0c;除了门店、入驻第三方电商平台或朋友圈售卖外&…

Docker 容器监控 - Weave Scope

Author&#xff1a;rab 目录 前言一、环境二、部署三、监控3.1 容器监控 - 单 Host3.2 容器监控 - 多 Host 总结 前言 Docker 容器的监控方式有很多&#xff0c;如 cAdvisor、Prometheus 等。今天我们来看看其另一种监控方式 —— Weave Scope&#xff0c;此监控方法似乎用的人…

ctfshow—1024系列练习

1024 柏拉图 有点像rce远程执行&#xff0c;有四个按钮&#xff0c;分别对应四份php文件&#xff0c;开始搞一下。一开始&#xff0c;先要试探出 文件上传到哪里&#xff1f; 怎么读取上传的文件&#xff1f; 第一步&#xff1a;试探上传文件位置 直接用burp抓包&#xff0c;…

PowerPoint如何设置密码?

PowerPoint&#xff0c;也就是PPT&#xff0c;是很多人工作中经常用的办公软件&#xff0c;而PPT和Word、Excel等一样可以设置密码保护。 PPT可以设置两种密码&#xff0c;一种是“打开密码”&#xff0c;也就是需要密码才能打开PPT&#xff1b;还有一种是设置成有密码的“只读…

python实现http/https拦截

python实现http拦截 前言:为什么要使用http拦截一、技术调研二、技术选择三、使用方法前言:为什么要使用http拦截 大多数爬虫玩家会直接选择API请求数据,但是有的网站需要解决扫码登录、Cookie校验、数字签名等,这种方法实现时间长,难度高。需求里面不需要高并发,有没有…

Docker系列--在容器中安装JDK的方法(有示例)

原文网址&#xff1a;Docker系列--在容器中安装JDK的方法(有示例)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何在容器中安装JDK。 为什么要装JDK&#xff1f; JDK里有很多工具&#xff0c;比如jps、jstack、jmap等&#xff0c;可以排查问题。 本文目标 给Ubuntu系…

【数据结构】海量数据处理

【数据结构】海量数据处理 前言 海量数据处理是指基于海量数据的存储和处理&#xff0c;正因为数据量太大&#xff0c;所以导致要么无法在短时间内迅速处理&#xff0c;要么无法一次性装入内存。 对于时间问题&#xff0c;就可以采用位图、布隆过滤器等数据结构来解决。对于…

摄影后期图像编辑软件Lightroom Classic 2023 mac中文特点介绍

Lightroom Classic 2023 mac是一款图像处理软件&#xff0c;是数字摄影后期制作的重要工具之一&#xff0c;lrc2023 mac适合数字摄影后期制作、摄影师、设计师等专业人士使用。 Lightroom Classic 2023 mac软件特点 高效的图像管理&#xff1a;Lightroom Classic提供了强大的图…

分布式应用程序协调服务 ZooKeeper 详解

目录 1、ZooKeeper简介 2、ZooKeeper的使用场景 3、ZooKeeper设计目的 4、ZooKeeper数据模型 5、ZooKeeper几个重要概念 5.1、ZooKeeper Session 5.2、ZooKeeper Watch 5.3、Consistency Guarantees 6、ZooKeeper的工作原理 6.1、Leader Election 6.2、Leader工作流…

Docker中MySql容器的数据挂载

1.查看是否有数据卷 docker inspect mysql 说明&#xff1a;Name的值是随机生成的不是命令的。因此没有数据卷。 2. 目录挂载 说明&#xff1a;本地目录不允许简写&#xff1b;在执行docker runi命令时&#xff0c;使用-v本地目录&#xff1a;容器内目录可以完成本地目录挂载…

Python之函数、模块、包库

函数、模块、包库基础概念和作用 A、函数 减少代码重复 将复杂问题代码分解成简单模块 提高代码可读性 复用老代码 """ 函数 """# 定义一个函数 def my_fuvtion():# 函数执行部分print(这是一个函数)# 定义带有参数的函数 def say_hello(n…

列表的增删改查和遍历

任务概念 什么是任务 任务是一个参数为指针&#xff0c;无法返回的函数&#xff0c;函数体为死循环不能返回任务的实现过程 每个任务是独立的&#xff0c;需要为任务分别分配栈称为任务栈&#xff0c;通常是预定义的全局数组&#xff0c;也可以是动态分配的一段内存空间&#…

农产品团购配送商城小程序的作用是什么

农产品覆盖稻麦油蛋等多种细分类目&#xff0c;各地区经营商家众多&#xff0c;随着人们生活品质提升&#xff0c;对食物的要求也在提升&#xff0c;绿色无污染无激素的农产品往往受到不少人喜爱&#xff0c;而在销售中&#xff0c;也有不少人选择自建商城线上经营。 通过【雨…

【软考】磁盘工作原理 计算最多最少读取时间

这个题目重复看了三四遍讲解&#xff0c;才完全搞懂计算过程&#xff0c;特此记录 解析 磁头不会停止旋转 单缓冲区&#xff1a;读取完一个物理块后&#xff0c;只有等该物理块处理完成&#xff0c;才能继续读取后面的物理块。 最长时间 摆放顺序如下&#xff1a; 从 R0 开始…

【JavaEE】JavaScript webAPI的基本知识

JavaScript Web API 文章目录 JavaScript Web APIwebAPI背景DOMDOM树 获取元素querySelectorquerySelectorAll 事件初识键盘事件onkeydownonkeypressonkeyup 操作元素获取/修改元素内容1.innerText2.innerHTML 获取/修改元素属性获取/修改表单元素属性获取/修改样式属性行内样式…

JUC——并发编程—第四部分

理解JMM Volatile是Java虚拟机提供的轻量级的同步机制。有三大特性。 1.保证可见性 2.不保证原子性 3.禁止指令重排 定义:Java内存模型&#xff0c;是一个概念。 关于JMM的一些同步的约定: 1、线程解锁前&#xff0c;必须把共享变量立刻刷回主存. 2、线程加锁前&#x…

华为鸿蒙手表开发之动态生成二维码

华为鸿蒙手表开发之动态生成二维码 前言&#xff1a; 最近入职新公司&#xff0c;由于之前的哥们临时离职&#xff0c;走得很突然&#xff0c;所以没有任何交接和文档&#xff0c;临时顶上公司手表应用的上架&#xff0c;更换了新的密钥和key之后重新测试功能和流程&#xff…

FFmpeg 基础模块:下载编译与安装、常用命令、处理流程

FFmpeg源码下载 我们会逐步分析作为 API 用户我们需要了解的 FFmpeg 中的重要模块&#xff0c;比如 AVFormat 模块、AVcodec 模块、AVfilter 模块、swscale 模块、swresample 模块。 在具体讲解如何使用 FFmpeg 的 API 之前&#xff0c;为了方便你查看 API 对应的代码&#x…

图像处理初学者导引---OpenCV 方法演示项目

OpenCV 方法演示项目 项目地址&#xff1a;https://github.com/WangQvQ/opencv-tutorial 项目简介 这个开源项目是一个用于演示 OpenCV 方法的工具&#xff0c;旨在帮助初学者快速理解和掌握 OpenCV 图像处理技术。通过这个项目&#xff0c;你可以轻松地对图像进行各种处理&a…

Transformer学习-self-attention

这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention&#xff0c;即用每项的query向量去匹配所有的key向量&#xff0c;得…