【Leetcode】top 100 多维动态规划

62 不同路径

一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步,机器人试图达到网格的右下角,问总共有多少条不同的路径?

分析:dp[i][j] 代表走到 (i, j) 的路径总和数

递推规律:dp[i][j] = dp[i-1][j] + dp[i][j-1]

初始条件:dp[0][:] = 1 dp[:][0] = 1

class Solution(object):def uniquePaths(self, m, n):""":type m: int:type n: int:rtype: int"""dp = [[1]*n for _ in range(m)]for i in range(1, m):for j in range(1,n):dp[i][j] = dp[i-1][j] + dp[i][j-1]return dp[-1][-1]# 滚动数组更新,记录dp可同时表示i-1和i行
# 因为更新dp[i][j]时需要用到的dp[i-1][j]未被更新,而dp[i][j-1]已更新
class Solution(object):def uniquePaths(self, m, n):""":type m: int:type n: int:rtype: int"""dp = [1]*nfor i in range(1, m):for j in range(1,n):dp[j] = dp[j] + dp[j-1]return dp[-1]

官方技巧:移动到 (m, n) 总共需要 m+n-2 步,其中必有 m-1 步向下移动,n-1 步向左移动,故总路径为组合数:C(m+n-2)(m-1)

 64 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。

分析:dp[i][j] 代表走到 (i, j) 的数字总和

递推规律:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + nums[i][j]

初始条件:dp[0][j] = sum(nums[0][:j])   dp[i][0] = sum(nums[:i][0])

class Solution(object):def minPathSum(self, grid):""":type grid: List[List[int]]:rtype: int"""m, n = len(grid), len(grid[0])dp = [[0]*n for _ in range(m)]for i in range(m):for j in range(n):if i==0:dp[i][j]=dp[i][j-1]+grid[i][j] elif j==0:dp[i][j]=dp[i-1][j]+grid[i][j] else:dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j]return dp[-1][-1]# 这里有个trick,因为要处理0行0列,所以初始化必须得是0
# 因为处理0行0列时-1行-1列还没处理,元素均为0,不会对累加产生影响
 5 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

方法一:二维动态规划

分析:dp[i][j] 代表 s[i:j] 是否为回文子串的情况

递推规律:dp[i][j] = dp[i+1][j-1] + (s[i]==s[j])

初始条件:i=j时 dp[i][j] = true

需要记录最长长度和起始位置;注意dp的!!!更新方向!!!

class Solution(object):def longestPalindrome(self, s):""":type s: str:rtype: str"""dp = [[False]*length for _ in range(length)]start, maxlen, length = 0, 0, len(s)for i in range(length-1,-1,-1):for j in range(i,length):if j==i:dp[i][j] = Trueelif j==i+1:if s[i]==s[j]:dp[i][j] = Trueelse:if dp[i+1][j-1] and s[i]==s[j]:dp[i][j] = Trueif dp[i][j]:maxlen = max(maxlen, j-i+1)if maxlen == j-i+1:start = ireturn s[start:start+maxlen]# 问题出在需要用dp[i+1][j-1]决定dp[i][j]的状态,所以需要先更新dp的左下方(i需要倒序)

方法二:中心扩散法

回文子串的有1or2个中心;

class Solution(object):def longestPalindrome(self, s):""":type s: str:rtype: str"""out = ''for i in range(len(s)):sub1 = self.palindrome(s, i, i)sub2 = self.palindrome(s, i, i+1)out = sub1 if len(sub1) > len(out) else outout = sub2 if len(sub2) > len(out) else outreturn outdef palindrome(self, s, l, r):while l >= 0 and r < len(s) and s[l] == s[r]:l -= 1r += 1return s[l+1:r]

相同时间复杂度的情况下,方法二比方法一节省了内存开销;

减小时间复杂度:马拉车算法...

 1143 最长公共子序列

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

分析:dp[i][j] 代表 text1[0:i] 和 text2[0:j] 的最长公共子序列的长度

递推规律:当text1[i] = text2[j]时,dp[i][j] = dp[i-1][j-1]+1  

                  当text1[i] != text2[j]时,dp[i][j] = max(dp[i-1][j], dp[i][j-1])  

初始条件:dp[0][:]=0    dp[:][0]=0

class Solution(object):def longestCommonSubsequence(self, text1, text2):""":type text1: str:type text2: str:rtype: int"""m, n = len(text1), len(text2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(1,m+1):for j in range(1,n+1):if 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[-1][-1]
 72 编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。你可以进行插入/删除/替换三种操作;

分析:dp[i][j] 代表 word1[0:i] 转换成 word2[0:j] 使用的最少操作数;

递推规律:当 word1[i-1] = word2[j-1] 时,dp[i][j] = dp[i-1][j-1]

                  当 word1[i-1] != word2[j-1] 时,dp[i][j] = min(增/删/改)+1

                        增:word[i-1][j]  删:word[i+1][j]  改:word[i-1][j-1] 但增/删会卡死i的遍历方向;

                        增加word1和删减word2的操作数等价:word1=smile      word2=smilea

                        增:word[i-1][j]  删:word[i][j-1]  改:word[i-1][j-1]

初始条件:dp[0][j]=j   dp[i][0]=i

class Solution(object):def minDistance(self, word1, word2):""":type word1: str:type word2: str:rtype: int"""m, n = len(word1), len(word2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(m+1):for j in range(n+1):if i==0:dp[i][j] = jelif j==0:dp[i][j] = i else:if word1[i-1]==word2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1])+1return dp[-1][-1]

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

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

相关文章

java.lang.String final

关于String不可变的问题&#xff1a;从毕业面试到现在&#xff0c;一个群里讨论的东西&#xff0c;反正码农面试啥都有&#xff0c;这也是我不咋喜欢面试代码&#xff0c;因为对于我而言&#xff0c;我并不喜欢这些面试。知道或不知道基本没啥含氧量&#xff0c;就是看看源代码…

构造函数调用规则

默认情况下&#xff0c;c编译器至少给一个类添加3个函数 1&#xff0e;默认构造函数(无参&#xff0c;函数体为空) 2&#xff0e;默认析构函数(无参&#xff0c;函数体为空) 3&#xff0e;默认拷贝构造函数&#xff0c;对属性进行值拷贝(“”号赋值) 构造函数调用规则如下&…

大数据,或称巨量资料

大数据&#xff0c;或称巨量资料&#xff0c;指的是在传统数据处理应用软件不足以处理的大或复杂的数据集。大数据也可以定义为来自各种来源的大量非结构化或结构化数据。从学术角度而言&#xff0c;大数据的出现促成广泛主题的新颖研究&#xff0c;这也导致各种大数据统计方法…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…

【Python 48小时速成 8】函数

在 Python 中&#xff0c;函数是一段可重复调用的代码块&#xff0c;用于执行特定任务。函数可以接受参数并返回值。下面是函数的基本结构以及示例代码&#xff1a; # 示例代码一&#xff1a;定义一个简单的函数 def greet():print("Hello, World!") # 函数体内的代…

界面组态软件---昆仑通态

昆仑通态参考资料 HMI人机界面 昆仑通态专题&#xff08;三&#xff09;&#xff1a;MCGS嵌入版组态软件的报警 HMI触摸屏编程

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

记录 Selenium 常用功能和API

目录 WebDriver 类 常用 APIWebElement 类 常用 API元素等待机制sleep()方法隐式等待显式等待重写 apply() 方法ExpectedConditions类中常用方法页面加载超时设置 浏览器操作控制浏览器操作Window 类Navigation 类 浏览器窗口的切换滚动条操作弹出框处理&#xff08;alert、con…

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加网站分析工具&#x1f528;使用Google Analytics&#x1f527;步骤 1: 注册Google Analytics账户&#x1f527;步骤 2: 获取跟踪代码 &#x1f528;使用Vue.js&#…

[AIGC] Apache HTTP服务器:历史与使用

Apache HTTP服务器&#xff1a;历史与使用 Apache HTTP服务器&#xff0c;通常我们简称为Apache&#xff0c;是一款流行且强大的开源Web服务器软件。它伴随互联网的快速成长&#xff0c;并承载了许多网站服务的运行和访问。通过最新的科技和广阔的功能&#xff0c;Apache服务器…

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…

MyBatis:XML操作

&#x1f451;专栏内容&#xff1a;MyBatis⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、MyBatis XML方式1、配置数据库2、指明XML路径3、写持久层代码 二、基础操作1、新增2、删除3、更新4、查找Ⅰ、开启驼峰命…

配置视图解析器

我们在指定视图的时候路径是有重复的&#xff0c;重复的操作可以用视图解析器&#xff0c;让框架帮我们&#xff1a; mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器&#xff1a; 注册视图解析器:帮…

202112青少年软件编程(Scratch图形化)等级考试试卷(三级)

第1题:【 单选题】 下列程序哪个可以实现: 按下空格键, 播放完音乐后说“你好! ” 2 秒? ( ) A: B: C: D: 【正确答案】: C 【试题解析】 : 第2题:【 单选题】 执行下列程序, 变量 N 的值不可能是? ( ) A:1 B:4 C:5 D:6 【正确答案】: D 【试题解析】…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

ES集群部署:定时清除last_run_metadata_path数据

文章目录 引言I crontab 周期自动执行相应命令1.1 crontab语法1.2 crontab 文件示例1.3 系统范围内的 crontab 文件II logstash2.1 conf 参考2.2 statement_filepath2.3 执行引言 需求: 每天定时删除logstash的last_run_metadata_path文件,间接清除last_run_metadata_path数据…

分治法排序:原理与C语言实现

分治法排序&#xff1a;原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中&#xff0c;分治法是一种解决问题的策略&#xff0c;它将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问…

Expert Prompting-引导LLM成为杰出专家

ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 如果适当设计提示&#xff0c;对齐的大型语言模型&#xff08;LLM&#xff09;的回答质量可以显著提高。在本文中&#xff0c;我们提出了ExpertPrompting&#xff0c;以激发LLM作为杰出专家回…

运动想象 (MI) 迁移学习系列 (14) : EEGNet-Fine tuning

运动想象迁移学习系列:EEGNet-Fine tuning 0. 引言1. 主要贡献2. 提出的方法2.1 EEGNet框架2.2 微调 3. 实验结果3.1 各模型整体分类结果3.2 算法复杂度比较3.3 不同微调方法比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.nature.com/articles/s41598-021-99114-1#cit…

【算法训练营】周测4

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-4 题目描述 输入格式 从标准输入读入数据。 输入第一行为两个正整…