代码随想录第36天:动态规划9(序列问题)

一、最长递增子序列(Leetcode 300)

1.dp数组定义:

dp[i] 为以 nums[i] 结尾的最长递增子序列长度。

2.状态转移:

dp[i] = max(dp[i], dp[j] + 1) for all j < i and nums[j] < nums[i]

2.dp数组初始化:

所有 dp[i] = 1,每个元素自身构成一个序列。

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:n = len(nums)if n == 0:return 0# 初始化 dp 数组,dp[i] 表示以 nums[i] 结尾的最长递增子序列长度dp = [1] * n  # 每个元素自身至少是一个长度为1的递增子序列# 遍历所有元素,尝试更新 dp[i]for i in range(n):for j in range(i):# 如果前一个元素小于当前元素,说明可以递增if nums[j] < nums[i]:# 更新 dp[i]:取之前小于它的元素能形成的最长递增子序列 +1dp[i] = max(dp[i], dp[j] + 1)# 最终答案是 dp 数组中的最大值return max(dp)

二、最长连续递增序列(Leetcode 674)

相比题一多了要求“连续”

1.dp数组定义:

dp[i] 为以 nums[i] 结尾的最长递增子序列长度。

2.状态转移:

dp[i] = max(dp[i], dp[j] + 1) for all j < i and nums[j] < nums[i]

2.dp数组初始化:

所有 dp[i] = 1,每个元素自身构成一个序列。

class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:n = len(nums)if n <= 1:return 1dp = [1] * n  # 初始化:每个位置至少是1max_len = 1   # 用于记录最大值for i in range(1, n):if nums[i] > nums[i - 1]:dp[i] = dp[i - 1] + 1else:dp[i] = 1max_len = max(max_len, dp[i])  # 更新最大长度return max_len

三、最长重复子数组 (Leetcode 718)

1.dp数组及下标定义

dp[i][j] 表示:以 nums1[i-1]nums2[j-1] 结尾的最长公共子数组的长度。

2.状态转移方程:

  • nums1[i-1] == nums2[j-1]
    dp[i][j] = dp[i-1][j-1] + 1

  • 否则:
    dp[i][j] = 0(连续子数组中断)

3.dp数组初始化:

根据dp[i][j]的定义,dp[i][0] 和dp[0][j]其实都是没有意义的!

但dp[i][0] 和dp[0][j]要初始值,为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1

所以dp[i][0] 和dp[0][j]初始化为0。

class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:n, m = len(nums1), len(nums2)# 初始化 dp 数组,dp[i][j] 表示 nums1 前 i 个元素与 nums2 前 j 个元素# 的最长公共子数组(结尾必须是 nums1[i-1] 与 nums2[j-1])的长度dp = [[0] * (m + 1) for _ in range(n + 1)]max_len = 0  # 记录最长公共子数组的长度# 遍历 nums1 和 nums2 所有元素for i in range(1, n + 1):for j in range(1, m + 1):# 如果当前两个元素相等,更新 dp 值if nums1[i - 1] == nums2[j - 1]:# 在两个前缀都减 1 的基础上加 1dp[i][j] = dp[i - 1][j - 1] + 1# 更新最大长度max_len = max(max_len, dp[i][j])# 否则默认 dp[i][j] = 0(初始化时已经为 0)return max_len

4.dp数组初始化注意事项:

dp = [[0] * (列数) for _ in range(行数)]
那么你的外层循环必须是 for i in range(行数 - 1)

内层循环是 for j in range(列数 - 1),并且数组元素访问要对应上。

四、最长公共子序列 (Leetcode 1143)

1.dp数组定义:

dp[i][j] 表示:text1 的前 i 个字符 和 text2 的前 j 个字符 的最长公共子序列长度

2.状态转移:

如果 text1[i - 1] == text2[j - 1],说明当前字符可以匹配:
dp[i][j] = dp[i - 1][j - 1] + 1

否则假设在比较字符串 text1[0..i-1]text2[0..j-1]

  • 当前字符不匹配:text1[i - 1] != text2[j - 1]

这意味着:我们无法把这两个字符都纳入公共子序列中。

我们有两个选择:

  1. 跳过 text1[i - 1],继续比较前 i-1 个字符与前 j 个字符

    • 即:dp[i - 1][j]

  2. 跳过 text2[j - 1],继续比较前 i 个字符与前 j-1 个字符

    • 即:dp[i][j - 1]

我们选择其中 能构成更长公共子序列的路径,所以取最大值:

dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

2.dp数组初始化:

dp[0][*]dp[*][0] = 0,表示有一个空串时,LCS 为 0

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n = len(text1), len(text2)# 创建 dp 数组,额外多一行一列用于处理边界dp = [[0] * (n + 1) for _ in range(m + 1)]# 遍历每个字符for i in range(1, m + 1):for j in range(1, n + 1):# 如果当前字符相同,匹配成功,继承左上角 +1if text1[i - 1] == text2[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]

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

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

相关文章

【Spring Boot 注解】@SpringBootApplication

文章目录 SpringBootApplication注解一、简介二、使用1.指定要扫描的包 SpringBootApplication注解 一、简介 SpringBootApplication 是 Spring Boot 提供的一个注解&#xff0c;通常用于启动类&#xff08;主类&#xff09;上&#xff0c;它是三个注解的组合&#xff1a; 1.…

openstack虚拟机状态异常处理

1、openstack虚拟机task_state状态异常处理 问题描述&#xff1a; 正常状态&#xff1a; 异常状态&#xff1a; 任务状态应为 无&#xff0c;但该虚拟机为None。无法执行开机、关机等操作。 当前异常状态下通过命令行关闭虚拟机会报错&#xff0c;报错信息如下&#xff1a; […

【数据结构】手撕二叉搜索树

目录 二叉搜索树的概念二叉搜索树的实现节点类构造函数拷贝构造函数赋值运算符重载析构函数插入函数查找函数删除函数中序遍历 二叉搜索树的应用(k和k/v模型 ) 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树…

蓝桥杯 20. 倍数问题

倍数问题 原题目链接 题目描述 众所周知&#xff0c;小葱同学擅长计算&#xff0c;尤其擅长判断一个数是否是另一个数的倍数。但当面对多个数时&#xff0c;他就比较苦恼了。 现在小葱给了你 n 个数&#xff0c;希望你从中找出三个数&#xff0c;使得这三个数的 和是 K 的倍…

SpirngAI框架 Advisor API详解

SpringAI提供了Advisors API来实现请求和响应的拦截&#xff0c;修改&#xff0c;增强Spring应用程序和AI模型的互动。 可以使用ChatClient API来配置现有的advisor&#xff0c;例如&#xff1a; var chatClient ChatClient.builder(chatModel) .defaultAdvisors( new Message…

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)

这里我们来实现这个RPC的client端 为了实现RPC的效果&#xff0c;我们调用的Hello方法&#xff0c;即server端的方法&#xff0c;应该是由代理来调用&#xff0c;让proxy里面封装网络请求&#xff0c;消息的发送和接受处理。而上一篇文章提到的服务端的代理已经在.rpc.go文件中…

bpftrace 中使用 bpf_trace_printk

bpf_trace_printk bcc 中可以通过 bpf_trace_printk 来打印输出 , 同时有个非常有用的功能, 同时输出到 /sys/kernel/tracing/trace 文件中 比如bcc代码 // read_trace.c&#xff08;eBPF 内核态代码&#xff09; #include <vmlinux.h> #include <bpf/bpf_helpers.h…

解决 Chrome 与 Chromedriver 版本不一致问题的方法

目录 常见错误处理 处理方案&#xff1a; 1. 自动版本匹配方法 使用 webdriver-manager 库&#xff08;推荐&#xff09; 2. 手动版本管理方法 检查并匹配版本 3. 版本兼容性解决方案 使用兼容性表 4. 自动更新策略 定期检查更新脚本 5. Docker 容器化方案 最佳实践建…

【强化学习】强化学习算法 - 多臂老虎机问题

1、环境/问题介绍 概述&#xff1a;多臂老虎机问题是指&#xff1a;智能体在有限的试验回合 &#x1d447; 内&#xff0c;从 &#x1d43e; 台具有未知奖赏分布的“老虎机”中反复选择一个臂&#xff08;即拉杆&#xff09;&#xff0c;每次拉杆后获得随机奖励&#xff0c;目…

pcie协议复位

pcie协议复位共有4中情况&#xff1b;cold reset&#xff1b;warm reset&#xff1b;hot reset&#xff1b;function level reset&#xff1b; 分类&#xff1a; 依据spec 6.6&#xff1a; Conventional reset&#xff08;传统复位&#xff09;&#xff1a;cold&#xff0c;…

Redis--哈希类型

目录 一、Hash 哈希 1.2 常用命令 1.2.1 HSET 1.2.2 HGET 1.2.3 HEXISTS 1.2.4 HDEL 1.2.5 HKEYS 1.2.6 HVALS 1.2.7 HGETALL 1.2.8 HMGET 1.2.9 HLEN 1.2.10 HSETNX 1.2.11 HINCRBY 1.2.12 HINCRBYFLOAT 1.3 内部编码 一、Hash 哈希 几乎所有的主流编程语言都提…

华为安全认证好还是数通认证好?

在华为认证体系中&#xff0c;安全认证 与数通认证 &#xff08;数据通信&#xff09;是两个热门方向&#xff0c;分别面向网络安全与网络架构领域。 安全和数通的技术难度对比 市场需求 安全认证&#xff1a;随着网络安全形势日益严峻&#xff0c;企业对网络安全的重视程度不…

Nacos源码—5.Nacos配置中心实现分析二

大纲 1.关于Nacos配置中心的几个问题 2.Nacos如何整合SpringBoot读取远程配置 3.Nacos加载读取远程配置数据的源码分析 4.客户端如何感知远程配置数据的变更 5.集群架构下节点间如何同步配置数据 4.客户端如何感知远程配置数据的变更 (1)ConfigService对象使用介绍 (2)客…

电力MOSFET的专用集成驱动电路IR2233

IR2233是IR2133/IR2233/IR2235 系列驱动芯片中的一种,是专为高电压、高速度的电力MOSFET和IGBT驱动而设计的。该系列驱动芯片内部集成了互相独立的三组板桥驱动电路,可对上下桥臂提供死区时间,特别适合于三相电源变换等方面的应用。其内部集成了独立的运算放大器可通过外部桥…

六级阅读———2024.12卷一 仔细阅读2

文章 An awakening has been taking place in the physical world against the beauty model that has been dictated to us for years.But in the digital arena,social media determines what is considered beautiful.(51) The two opposing struggles are taking place i…

【C/C++】errno/strerror 和 GetLastError()/FormatMessage 的区别

strerror 和 errno 详解 printf("Error: %s\n", strerror(errno));这行代码用于在 C 语言中输出系统错误信息&#xff0c;但它与 Windows 的 GetLastError() 有重要区别。下面我将详细解释每个部分及其工作原理。 1. 组件解析 errno 定义&#xff1a;errno 是一个…

Unicode和UTF - 8主要有以下区别

Unicode和UTF - 8主要有以下区别 概念范畴 Unicode:是字符集 。它为世界上几乎所有的字符(包括各国文字、标点符号、特殊符号等)分配了唯一的编号,这个编号也叫码位、码点,比如“中”字的Unicode码点是U+4E2D 。它规定了字符的抽象表示,只关注字符与数字编号的对应关系,…

企业数字化转型第二课:接受不完美(1/2)

一.引言 先看一组中国企业数字化转型相关的数据&#xff1a; 战略认知层面&#xff1a;92%中国企业将数字化纳入战略核心&#xff08;麦肯锡2023&#xff09;执行困境层面&#xff1a;63%企业转型首年遭遇重大挫折&#xff08;BCG 2024追踪&#xff09;价值释放周期&#xff1…

OSCP - Proving Grounds - Sumo

主要知识点 ShellShock漏洞dirtycow提权 具体步骤 执行nmap扫描,比较直观&#xff0c;22和80端口开放&#xff0c;但是80端口没有什么内容 Nmap scan report for 192.168.210.87 Host is up (0.44s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SERV…

pyqt写一个TCP(UDP)检测工具

先用电脑连接到目标WIFI&#xff0c;再运行以下代码。 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtNetwork import *class NetTestTool(QWidget):def __init__(self):super().__init__()self.init_ui()self.tcp_socket QTcpSocket()…