初见DP

线性DP

例题1

1143. 最长公共子序列 (LCS)

子序列不连续

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

本质是选或不选

dfs(i,j)表示s的前i个字母和t的前j个字母的LCS长度

当s[i]=t[j]的时候,dfs(i-1,j-1)+1是要大于前面两个的,舍弃前两个

s[i]!=t[j]的时候,前面两个会自动递归到 dfs(i-1,j-1)+1,因此舍弃

代码:

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:x=len(text1)y=len(text2)@cachedef dfs(n,m):if n<0 or m<0:return 0if text1[n]==text2[m]:return (dfs(n-1,m-1)+1)if text1[n]!=text2[m]:return max(dfs(n-1,m),dfs(n,m-1))return dfs(x-1,y-1)

改成数组:注意避免负数下标,这里都往后移一位

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:x1=len(text1)y1=len(text2)f=[[0]*(y1+1)  for _ in range(x1+1)]for i,x in enumerate(text1):for j,y in enumerate(text2):if x==y:f[i+1][j+1]=f[i][j]+1else:f[i+1][j+1]=max(f[i][j+1],f[i+1][j])return f[x1][y1]

72. 编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

思路:从末尾值开始比较,如果s[i]=t[j]  直接dfs(i-1.j-1),因为不能改变这个值已经想同了

删除一个字母:相当于去掉s[i],也就是dfs(i,j-1)

插入一个字母,插入的肯定是和t[j]是一样的,所以是dfs[i+1,j],因为此时s[i]=t[j] ,所以同时减去1,得到最终答案dfs(i.j-1)

替换:把s【i】替换成t【j】,在同时减去1,也就是dfs(i-1,j-1)+1

代码:

class Solution:def minDistance(self, word1: str, word2: str) -> int:n=len(word1)m=len(word2)@cachedef dfs(i,j):if i<0:return j+1if j<0:return i+1if word1[i]==word2[j]:return dfs(i-1,j-1)return min(dfs(i-1,j),dfs(i,j-1),dfs(i-1,j-1))+1return dfs(n-1,m-1)

数组:

class Solution:def minDistance(self, s: str, t: str) -> int:n, m = len(s), len(t)f = [[0] * (m + 1) for _ in range(n + 1)]f[0] = list(range(m + 1))for i, x in enumerate(s):f[i + 1][0] = i + 1for j, y in enumerate(t):f[i + 1][j + 1] = f[i][j] if x == y else \min(f[i][j + 1], f[i + 1][j], f[i][j]) + 1return f[n][m]#f[0] = list(range(m + 1))表示初始化第一行,即s为空字符串时与t的编辑距离。因为此时s为空,所以只需要插入操作即可将t转换为s,所以第一行从0开始递增。f[i + 1][0] = i + 1表示初始化第一列,即t为空字符串时与s的编辑距离。因为此时t为空,所以只需要删除操作即可将s转换为t,所以第一列从0开始递增。

300. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的

子序列

。 

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

递归代码:

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:n=len(nums)@cachedef dfs(i):res=0for x in range(i):if nums[x]<nums[i]:res= max(res,dfs(x))return res+1ans=0return max(dfs(i) for i in range(n))

转化成数组
 

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:n=len(nums)f=[0]*nfor i in range(n):for j in range(i):if nums[j]<nums[i]:f[i]=max(f[j],f[i])f[i]+=1return max(f)

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

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

相关文章

opencv 视频处理

概述 OpenCV 的视频模块是其核心组成部分之一&#xff0c;主要负责视频文件的读取、处理、分析以及视频流的捕获和输出。这一模块使得开发者能够轻松地处理来自摄像头、文件或其他视频源的视频数据&#xff0c;进行实时或离线的图像处理和计算机视觉任务。以下是 OpenCV 视频模…

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手&#xff0c;该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外&#xff0c;Pentest Muse甚至还能够执行命令行代码并以迭代方式…

Excel 找出最大值及其相邻的 N 个成员

某列都是数值&#xff1a; A1132213464215496973482396101113712491342144015151631171718114719182030212222423252419251326272738283029163012312332333233419351436463723383739384028 请找出最大值及其相邻的 10 个成员&#xff0c;注意越界检查&#xff0c;实际符合条件…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码&#xff1a;可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术&#xff0c;为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能&#xff0c;通过与医保系统的对接&#xff0c;实现了医疗费用的自…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1&#xff09;socket----创建socket对象。 2&#xff09;bind----绑定本机ipport。 3&#xff09;listen----监听来电&#xff0c;若在监听到来电&#xff0c;则建…

Vue 3的组合式API:你真的需要它吗?

Vue 3的组合式API&#xff1a;你真的需要它吗&#xff1f; 随着Vue 3的发布&#xff0c;我们迎来了一个新的API——组合式API&#xff08;Composition API&#xff09;。这个API为开发者提供了更灵活、更可复用的代码编写方式。然而&#xff0c;传统的选项式API&#xff08;Opt…

分布式操作系统入门:可的哥(Codigger)引领新潮流

早期&#xff0c;大型机系统盛行&#xff0c;随后个人计算机如Windows、Mac OS等操作系统普及。随着技术发展和计算需求增长&#xff0c;单机系统的局限显现&#xff0c;推动了分布式操作系统的崛起。操作系统演进显露出从单机到多机、从集中到分散的趋势。传统单机系统在处理大…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 当你从摄像头读取实时视频时&#xff0c;如果想在视频的画面中画一个方框&#xff0c;或者是画一个圆&#xff0c;是很简单的事情&#xff0c;可是…

Python爬虫技术:动态JavaScript加载音频的解析

在当今的互联网世界中&#xff0c;JavaScript已成为构建丰富交互体验不可或缺的技术。然而&#xff0c;对于网络爬虫开发者来说&#xff0c;JavaScript动态生成的内容却带来了不小的挑战。音频内容的动态加载尤其如此&#xff0c;因为它们往往涉及到复杂的用户交互和异步数据加…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

【C#】字符串处理器

实现&#xff1a; 统计字符串中单词的数量。查找字符串中最长的单词&#xff0c;并显示其长度。将字符串中的所有单词首字母大写。将字符串中的所有单词反转。 要求&#xff1a; 使用面向对象的方式实现&#xff0c;包括至少一个类&#xff08;例如 StringProcessor&#xf…

视频智能分析平台智能边缘分析一体机视频监控业务平台区域人数不足检测算法

智能边缘分析一体机区域人数不足检测算法是一种集成了先进图像处理、目标检测、跟踪和计数等功能的算法&#xff0c;专门用于实时监测和统计指定区域内的人数&#xff0c;并在人数不足时发出警报。以下是对该算法的详细介绍&#xff1a; 一、算法概述 智能边缘分析一体机区域…

怎么把pdf文件转cad图纸?方法分享!

怎么把pdf文件转cad图纸&#xff1f;在数字化时代&#xff0c;PDF和CAD作为两种常见的文件格式&#xff0c;各自在各自的领域发挥着重要作用。然而&#xff0c;当需要在两者之间进行转换时&#xff0c;许多人可能会感到困惑和无从下手。今天&#xff0c;我将为大家推荐三款强大…

【无标题】小红书618投放高效复盘|种草效果评估

618大促进入尾声&#xff0c;品牌投放是否达到预期目标&#xff1f;如何找准复盘重点&#xff1f;如何衡量种草效果&#xff1f;如何沉淀优质的策略&#xff1f; 基于这些问题&#xff0c;千瓜推出618小红书投放复盘攻略&#xff0c;帮助品牌厘清复盘思路&#xff0c;在大促后快…

数组和文本三剑客

数组&#xff1a; 数组的定义&#xff1a;在集合当中指定多个元素&#xff0c;元素的类型&#xff1a;整数&#xff0c;字符串&#xff0c;浮点数。 数组的作用&#xff1a;可以一次性的定义多个元素&#xff0c;可以为变量赋值提供便利。 数组的定义方法&#xff1a; 数组…

手机录屏声音怎么录?2个小妙招教会你

手机录制好的视频怎么没有声音&#xff1f;你是否也遇到了这个难题&#xff1f;在日常生活中&#xff0c;手机录屏功能已经成为我们生活和工作中的得力助手。而录屏的声音&#xff0c;作为录屏功能的重要组成部分&#xff0c;更是为我们的录制体验增添了不少色彩。那么&#xf…

SSA-CNN多输入时序|樽海鞘算法-卷积神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&…

Termius for Mac/Win:跨平台多协议远程管理利器

Termius for Mac/Win是一款备受瞩目的跨平台多协议远程管理软件&#xff0c;以其卓越的性能、丰富的功能和便捷的操作体验&#xff0c;赢得了广大用户的青睐。无论是在企业IT管理、系统维护&#xff0c;还是个人远程连接、文件传输等方面&#xff0c;Termius都展现出了出色的实…

乾坤微服务的使用

前言&#xff1a; 在这里整理下用乾坤来开发微服务的一些资料。 使用好处&#xff1a; 使用乾坤可以实现什么效果呢&#xff1f;众所周知&#xff0c;前端的框架五花八门&#xff0c;react/vue/angular等各领风骚&#xff0c;那么如果我们有需要把不同技术栈的项目整合起来&…

Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

某天开机,发现Mysql被异常关闭,并且启动不起来,出这篇文章也是为了下次遇到类似问题,迅速解决(请细读文章,因为第二个方案才是主要方案) 第一个解决方案 我采用的第一个方法查“端口占用“问题(因为这是一篇博客所以我写的操作比较详细为了方便后面看这篇博客的人,我自…