代码随想录算法训练营第五十六天 | 动态规划 part 14 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和(dp)

news2024/11/20 1:36:14

目录

  • 1143.最长公共子序列
    • 思路
    • 代码
  • 1035.不相交的线
    • 思路
    • 代码
  • 53. 最大子序和(dp)
    • 思路
    • 代码

1143.最长公共子序列

Leetcode

在这里插入图片描述

思路

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

不是连续的话,具体写代码的区别体现在递推公式上,

if text1[i - 1] != text2[j - 1]: dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

从下图可以看出来可以有三个方向推导出dp[i][j]
在这里插入图片描述
举例推导dp数组

以输入:text1 = “abcde”, text2 = “ace” 为例,dp状态如图:

在这里插入图片描述

代码

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        dp = [[0] * (len(text1) + 1) for _ in range(len(text2) + 1)]

        for i in range(1, len(text2) + 1):
            for j in range(1, len(text1) + 1):
                if text2[i - 1] == text1[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[-1][-1]
  • 时间复杂度: O(n * m),其中 n 和 m 分别为 text1 和 text2 的长度
  • 空间复杂度: O(n * m)

1035.不相交的线

Leetcode
在这里插入图片描述

思路

此题和上题一模一样。

代码

class Solution:
    def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
        dp = [[0] * (len(nums1) + 1) for _ in range(len(nums2) + 1)]

        for i in range(1, len(nums2) + 1):
            for j in range(1, len(nums1) + 1):
                if nums2[i - 1] == nums1[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[-1][-1]

53. 最大子序和(dp)

Leetcode

在这里插入图片描述

思路

  1. dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。
  2. 递推公式:
    dp[i]只有两个方向可以推出来:
    • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
    • nums[i],即:从头开始计算当前连续子序列和
      我一开始写成了dp[i] = max(dp[i], dp[i - 1] + nums[i]),那这就不对了,因为这样就会受到dp[i]初始化的影响。
  3. 初始化:dp[0] = nums[0],剩下的随意
  4. 遍历顺序从前往后
  5. 举例
    以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下:
    在这里插入图片描述

代码

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp = [nums[0]] * len(nums)
        res = nums[0]
        for i in range(1, len(nums)):
            dp[i] = max(nums[i], dp[i - 1] + nums[i])
            res = max(res, dp[i])
        return res
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

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

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

相关文章

数据结构--队列与循环队列的实现

数据结构–队列的实现 1.队列的定义 比如有一个人叫做张三,这天他要去医院看病,看病时就需要先挂号,由于他来的比较晚,所以他的号码就比较大,来的比较早的号码就比较小,需要到就诊窗口从小号到大依次排队,前面的小号就诊结束之后,才会轮到大号来,小号每就诊完毕就销毁,每新来…

22.app.js的全局数据共享

app.js中定义的全局变量适合 不修改且仅在js中使用的变量 目录 1 全局变量 2 修改全局变量 3 app.js中的变量不能直接在wxml中渲染 4 全局方法 1 全局变量 比如我现在想定义一个全局的变量something,直接在APP中写就行了 之后你可以在任何一个页面中&…

嵌入式软件架构中抽象层设计方法

大家好,今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西,众说纷纭,各有观点。什么是软件架构,我们能在网上找到无数种定义。 比如,我们可以这样定义:软件架构是软件系统的基本结构&#xff0c…

并查集详解(原理+代码实现+应用)

文章目录 1. 并查集概念2. 并查集原理2.1 合并2.1 找根 3. 并查集实现3.1 结构定义3.2 FindRoot(找根)3.3 Union(合并)3.4 IsInSet(判断两个值是否在一个集合里)3.5 SetCount(并查集中集合个数&…

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)

文章目录 1. Unsafe upfileupload1.1 客户端检查(client check)1.1.1 源代码分析 1.2 服务端检查(MIME type)1.2.1 源代码分析 1.3 getimagesize()1.3.1 源代码分析 1.4 文件上传漏洞防御 1. Unsafe upfileupload 漏洞描述 文件…

springboot中的@Configuration详解~

作用1:告诉springboot这是一个配置类,等同于之前在spring中的配置文件,而且配置类中可以使用Bean标注在方法上给容器注册组件,该组件默认也是单例 创建pet: package com.springboot.bean;import lombok.AllArgsConstructor; import lombok.…

【进阶C语言】进阶指针--学会所有指针类型

本节内容大致目录: 1.字符指针 2.指针数组(数组) 3.数组指针 (指针)--比较重要 4.函数指针--比较重要 5.函数指针数组--用的较少 6.指向函数指针数组的指针--只需要了解就可以 需要掌握每一种类型的符号和用处。…

Google ProtoBuf介绍

一、背景 前段时间了解到有公司用gRPC、Pulsar、Nacos、SkyWalking、OpenTelemetry、Prometheus、Envoy、Grafana、Sonar、PowerJob、Apollo 这些技术,也是Java路线的,很惭愧,这些我几乎都不了解,从13年以来玩Android、玩Python、…

Java 多输入框查询需求实现

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 多输入框查询 需求分析 任意一个输入框,输入内容点击搜索都可以精准搜索到对应的内容 代码实现 Controller接口编写 PostMapping("merchant/manage&…

文献阅读:RLAIF: Scaling Reinforcement Learning from Human Feedback with AI Feedback

文献阅读:RLAIF: Scaling Reinforcement Learning from Human Feedback with AI Feedback 1. 文章简介2. 方法介绍 1. 整体方法说明 3. 实验结果 1. RLHF vs RLAIF2. Prompt的影响3. Self-Consistency4. Labeler Size的影响5. 标注数据的影响 4. 总结 & 思考 文…

SpringCloudGateway网关中各个过滤器的作用与介绍

文章目录 RemoveCachedBodyFilterAdaptCachedBodyGlobalFilterNettyWriteResponseFilterForwardPathFilterRouteToRequestUrlFilterWebSocketRoutingFilterNettyRoutingFilterForwardRoutingFilterDispatcherHandler 是什么?⭐如何确定最后的路由路径?下…

一文拿捏Spring之AOP

Spring 1.Spring的理解 1.狭义上 指SpringFramework,特别的控制反转、依赖注入、面向切面、等特性 2.广义上 Spring家族的一系列产品,像SpringMVC、SpringBoot、SpringCloud等 2.aop 🌟面试题(aop): 简单介绍一下AOP? aop…

【userfaultfd】2021强网杯notebook

程序分析 老规矩,看下启动脚本 开启了 smep、smap、kaslr 保护,当然 kvm64 默认开启 kpti 保护 文件系统初始化脚本 #!/bin/sh /bin/mount -t devtmpfs devtmpfs /dev chown root:tty /dev/console chown root:tty /dev/ptmx chown root:tty /dev/tty…

SAAJ:SOAP with Attachments API for Java

介绍 支持带附件的SOAP消息Java接口(SAAJ:SOAP with Attachments API for Java),定义了一套API,使开发者可以产生、消费遵从SOAP 1.1, SOAP 1.2, 和SOAP Attachments Feature的消息。 2019年SAAJ更改为新的名字&…

MIP精确算法的关键——确定界

目录 1.界是什么? 2. 如何更新上下界 2.1 以分支定界为框架的一系列算法 2.2 benders分解 MIP精确算法包含,分支定界、分支切割、分支定价还有benders分解等等。前者是以分支定界为框架的一类算法;后者是以分解为框架的一类算法。甚至还包…

Springboot学习笔记——1

Springboot学习笔记——1 一、快速上手Springboot1.1、Springboot入门程序开发1.1.1、IDEA创建Springboot项目1.1.2、官网创建Springboot项目1.1.3、阿里云创建Springboot项目1.1.4、手工制作Springboot项目 1.2、隐藏文件或文件夹1.3、入门案例解析1.3.1、parent1.3.2、starte…

嵌入式软件架构基础设施设计方法

大家好,今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西,众说纷纭,各有观点。在我看来,软件架构是软件系统的基本结构,包含其组件、组件之间的关系、组件设计与演进的规则,以及体现这些规则的基…

Nginx高级 第一部分:扩容

Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械…

【C/C++笔试练习】——常量指针和指针常量、结构体内存分配、统计输入的字母个数、排序子序列、倒置字符串

文章目录 C/C笔试练习1.常量指针和指针常量(1)常量指针和指针常量的定义(2)判别常量指针和指针常量(3)常量指针和指针常量的特性 2.结构体内存分配(4)计算结构体大小(5&a…

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元,相当于系统的“大脑”。 CPU的工作流程? CPU 的工作流程分为以下 5 个阶段:取指令…