力扣 hot100 -- 多维动态规划

👇woc,这不是最熟悉那种,记忆化 dfs 或者 普通的深度优先搜索??都适用于二维地图👇

DFS(深度优先搜索)8种题型_dfs典型问题-CSDN博客

目录

🥃不同路径

🌼最小路径和

🌼最长回文子串

AC  中心扩散

AC  动态规划

🐙最长公共子序列

🎂编辑距离


🥃不同路径

62. 不同路径 - 力扣(LeetCode)

“只能向下 或 向右”(注意限制条件)

注意二维vector的初始化,也可以直接用数组

/*
dp[i][j] : 到达(i, j)的路径数
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 每个点只来自于上边和左边
初始化 : dp[i][0] = 1, dp[][j] = 1
*/
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0)); // m行, 每一行 n 个元素for (int j = 0; j < n; ++j) dp[0][j] = 1; // 第一行初始化for (int i = 0; i < m; ++i)dp[i][0] = 1; // 第一列初始化for (int i = 1; i < m; ++i)for (int j = 1; j < n; ++j) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];return dp[m-1][n-1];}
};

🌼最小路径和

64. 最小路径和 - 力扣(LeetCode)

“只能向下 或 向右”(注意限制条件)

和上一题初始化不同,上一条是不同路径,本题是最小路径

/*
dp[i][j] : 到达(i, j)的最小路径和
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
初始化 : dp[0][0], 然后从 (0,0) 开始,分别向右向下初始化第 0 行,第 0 列
*/
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));dp[0][0] = grid[0][0];for (int j = 1; j < n; ++j)dp[0][j] = dp[0][j - 1] + grid[0][j]; // 第 0 行for (int i = 1; i < m; ++i)dp[i][0] = dp[i - 1][0] + grid[i][0]; // 第 0 列for (int i = 1; i < m; ++i)for (int j = 1; j < n; ++j) {dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];}return dp[m-1][n-1];}
};

🌼最长回文子串

5. 最长回文子串 - 力扣(LeetCode)

AC  中心扩散

遍历每一个字母,以这个字母为中心往外扩散,先找到以此为中心全部相同的字母

(比如 acdbbd 中的 bb),然后同时开始左右扩散,l - 1, r + 1,直到遇到左右边界不相等的字母(d == d,后面就不相等了,所以最长回文子串是 dbbd)

时间 O(n^2)

class Solution {
public:string longestPalindrome(string s) {int l = 0, r = 0, maxLen = 1; // 初始化 l, r 防止一个元素 out of rangefor (int i = 0; i < s.size(); ++i) {int left = i - 1, right = i + 1, len = 1; // len 当前长度// 左边 == s[i] 的while (left >= 0 && s[left] == s[i]) {left--;len++; }// 右边 == s[i] 的while (right < s.size() & s[right] == s[i]) {right++;len++;}// 左右同时扩展while (left >= 0 && right < s.size() && s[left] == s[right]) left--, right++, len += 2;if (len > maxLen) {maxLen = len;l = left + 1, r = right - 1; // 最长子串区间 [l, r]}}return s.substr(l, r - l + 1);}
};

AC  动态规划

中心扩散会有大量重复计算,比如 abbacd,第一个 b 已经计算过的回文串,第二个 b 还会重新计算,而 dp 能将计算过的状态记住,个别情况接近 O(n)

代码写完后,貌似没有发现时间上的优化,似乎都是差不多的

时间 O(n^2)

/*
dp[i][j] : 子串 [i, j] 区间是否回文
dp[i][j] = (dp[i+1][j-1] || j - i == 1) && (s[i] == s[j])
初始化 : dp[i][i] = 1 
*/
class Solution {
public:string longestPalindrome(string s) {int maxLen = 1, l = 0, r = 0, n = s.size();// 记得初始化 vector, 正确分配内存, 不然报错 null pointervector<vector<int>> dp(n, vector<int>(n, 0));for (int i = 0; i < n; ++i)dp[i][i] = 1;for (int j = 1; j < n; ++j) // 右边界 jfor (int i = 0; i < j; ++i) // 左边界 iif (s[i] == s[j] && (dp[i + 1][j - 1] || j - i == 1)) {dp[i][j] = 1;if (j - i + 1 > maxLen)maxLen = j - i + 1, l = i, r = j;}return s.substr(l, r - l + 1);}
};

🐙最长公共子序列

1143. 最长公共子序列 - 力扣(LeetCode)

dp[][] 下标从 1 开始,就不用初始化那么麻烦,也就是 dp[1][1] = 1,表示 text1[0] == text2[0]

/*
dp[i][j] : s1的[0, i-1] 和 s2的[0, j-1] 的最长公共子序列
if (s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
初始化 : dp[0][0] = 0 OR 1
*/
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.size(), n = text2.size();vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for (int i = 1; i <= m; ++i) // dp[][] 下标从 1 开始for (int j = 1; j <= n; ++j) {if (text1[i-1] == text2[j-1])dp[i][j] = dp[i-1][j-1] + 1;elsedp[i][j] = max(dp[i-1][j], dp[i][j-1]);}return dp[m][n];}
};// a c b q d b b q     
// a c d q

🎂编辑距离

72. 编辑距离 - 力扣(LeetCode)

1)类似上一题,dp[][] 下标从 1 开始,避免了麻烦的初始化,因为递推式有 [i-1][j-1], [i][j-1],

[i-1][j] 三种组合(下标改 1 开始后,<= m   <= n

2)增删改的递推式中,+1不一定正确,所以要取 增 删 改 的最小值

3)初始化,观察递推式,都是根据 左,上,左上 三个方位得到的,所以初始化第一行和第一列

/*
dp[i][j] : s1 前 i 个字符 --> s2 前 j 个字符(下标 1 开始)递推式: dp[i][j] = ...
(取增删改,三者的最小值,作为新的 dp[i][j])s1 增加1个变 s2: dp[i][j-1] + 1
s1 删除1个变 s2: dp[i-1][j] + 1
s1 替换1个变 s2: dp[i-1][j-1] + 1if (s1[i] == s2[j]) dp[i-1][j-1]
*/
class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size();vector<vector<int>> dp(m+1, vector<int>(n+1, 0));// 初始化for (int i = 1; i <= m; ++i)dp[i][0] = i; // 第一列for (int j = 1; j <= n; ++j)dp[0][j] = j; // 第一行for (int i = 1; i <= m; ++i)for (int j = 1; j <= n; ++j) {if (word1[i-1] == word2[j-1])dp[i][j] = dp[i - 1][j - 1]; // 不用操作else // 增删改的最小值dp[i][j] = min(dp[i][j-1], min(dp[i-1][j], dp[i-1][j-1])) + 1;}return dp[m][n];}
};

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

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

相关文章

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只&#xff0c;内容变化已多单一的fragment&#xff0c;变成连续的&#xff0c;特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动&#xff0c;到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

基于Python+Django+MySQL+Echarts的租房数据可视化分析系统

租房数据可视化 DjangoMySQLEcharts 基于PythonDjangoMySQLEcharts的租房数据可视化分析系统 Echarts 信息存储在数据库中 不含爬虫代码&#xff0c;或爬虫代码已失效 不支持登录注册 简介 基于DjangoMySQLEcharts的租房数据可视化系统通过连接数据库获取数据&#xff0c…

【格密码基础】旋转格的性质

目录 一. 回顾ZSVP问题 二. 基于ZSVP问题的密码系统 三. 格基旋转与Gram矩阵 四. 补充矩阵QR分解 4.1 矩阵分解 4.2 举例 前序文章请参考&#xff1a; 【格密码基础】详解ZSVP问题-CSDN博客 一. 回顾ZSVP问题 根据之前的讨论我们知道解决ZSVP问题的计算复杂度为&#x…

C++ 入门09:友元函数和友元类

往期回顾&#xff1a; C 入门06&#xff1a;类的进阶&#xff08;构造函数的重载与拷贝构造函数&#xff09;-CSDN博客 C 入门07&#xff1a;静态成员和常量成员-CSDN博客 C 入门08&#xff1a;运算符重载-CSDN博客 一、前言 在前面文章的学习中&#xff0c;我们了解了类和对象…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…

第九届MathorCup高校数学建模挑战赛-A题:基于数据驱动的城市轨道交通网络优化研究

目录 摘 要 一、 问题的提出 二、 基本假设 三、 符号说明 四、 问题分析 4.1 问题 1 的分析 4.2 问题 2 的分析 4.3 问题 3 的分析 4.4 问题 4 的分析 五、 问题 1 的模型建立与求解 5.1 问题分析 5.2 数据处理 5.2.1 数据统计 5.2.2 异常数据处理方法 5.2.3 剔除异常数据值 5…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA&#xff1f; 《网络弹性法案》&#xff08;CRA&#xff09;是即将出台的欧盟法规&#xff0c;旨在确保在欧盟销售的所有数字产品和服务&#xff08;如连接到互联网的软件和硬件&#xff09;都采用强大的网络安全措施。 该法案要求…

【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux…

Chrome浏览器的Profile数据内容简介

前文简介了Chrome存储的账密/Cookie数据&#xff1a;一段代码读取Chrome存储的所有账号密码和Cookie 本文再扩展介绍一下Chrome存储的其它一些隐私数据。 注&#xff1a;因为业务需要&#xff0c;简单调研了一些基本内容和存储路径&#xff0c;没有深入去研究&#xff0c;有啥…

新160个crackme - 002-abexcm5

运行分析 猜测需要输入正确序列号 PE分析 32位&#xff0c;ASM程序&#xff0c;无壳 静态分析 ida shift F12 &#xff0c;发现字符串定位主函数 分析主函数 lstrcat&#xff1a;拼接字符串 lstrcmpiA&#xff1a;比较字符串 动态调试 serial输入123456调试 发现序列号…

Codeforces Round 957 (Div. 3)(A~D题)

A. Only Pluses 思路: 优先增加最小的数&#xff0c;它们的乘积会是最优,假如只有两个数a和b&#xff0c;b>a&#xff0c;那么a 1&#xff0c;就增加一份b。如果b 1&#xff0c;只能增加1份a。因为 b > a&#xff0c;所以增加小的数是最优的。 代码: #include<bi…

Spring Boot集成groovy快速入门Demo

1.什么是groovy&#xff1f; Groovy 是构建在 JVM 上的一个轻量级却强大的动态语言&#xff0c;它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。 Groovy 就是用 Java 写的&#xff0c;Groovy 语法与 Java 语法类似&#xff0c;Groovy 代码能够与 Java 代码很好地结合&…

SunnyUI中UIAnalogMeter的使用

在 SunnyUI 控件库中&#xff0c;UIAnalogMeter 是一个模拟仪表盘控件&#xff0c;用于显示数值数据&#xff0c;如温度、压力、速度或其他需要模拟表盘形式显示的量。下面是如何在你的应用程序中使用 UIAnalogMeter 的步骤&#xff1a; 1. 引入 SunnyUI 控件库 确保你的项目…

STM32MP135裸机编程:定时器内核时钟频率计算方法

0 工具准备 STM32MP13xx参考手册 1 定时器内核时钟频率计算方法 1.1 定时器分组 STM32MP135的定时器按照时钟源不同分成了三组&#xff0c;如下&#xff1a; APB1: APB2: APB6&#xff1a; 1.2 定时器内核时钟频率计算方法 APB1DIV是APB1的分频系数&#xff0c;APB2DIV、…

python双下划线怎么打

连续按键盘上的“shift_”键两次即可&#xff0c;不同编辑器可能显示会不太一样。像图1中那样没连起来也是对的&#xff0c;没有语法错误。

基于python豆瓣电影爬虫数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+详细部署教程)

文章目录 基于python豆瓣电影爬虫数据可视化分析推荐系统&#xff08;完整系统源码数据库详细文档论文详细部署教程&#xff09;一、 选题背景二、研究目的三、开发技术介绍1、Django框架2、LDA3、机器学习推荐算法4、大数据爬虫5、大数据Echarts可视化 四、系统设计思想五、部…

C++ | Leetcode C++题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor->val) {anc…

贪心算法案例

1.买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

代码随想录算法训练营第31天|LeetCode 56. 合并区间、738.单调递增的数字、968.监控二叉树

1. LeetCode 56. 合并区间 题目链接&#xff1a;https://leetcode.cn/problems/merge-intervals/description/ 文章链接&#xff1a;https://programmercarl.com/0056.合并区间.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1wx4y157nD 思路&#xff1a; 本题关…