【七十二】【算法分析与设计】64. 最小路径和,79. 单词搜索,1143. 最长公共子序列,利用记忆化递归填写dp表,可以很容易解决边界和填表顺序

递归填写dp表

利用递归函数填写dp表,可以很容易完成边界的处理,并且不用考虑填表的顺序.

绝大部分的动态规划可以用递归填表.

不用考虑填表顺序,只需要遍历一遍dfs即可.

64. 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]] 输出:12

提示:

  • m == grid.length

  • n == grid[i].length

  • 1 <= m, n <= 200

  • 0 <= grid[i][j] <= 200

 
class Solution {
public:using ll = long long;vector<vector<int>> grid; // 定义二维网格gridint n, m;                 // 网格的行数和列数vector<vector<int>> dp;   // 动态规划表void solveinit() {n = grid.size(); // 获取网格行数m = grid[0].size(); // 获取网格列数dp.clear(); // 清空动态规划表dp.resize(n, vector<int>(m, -1)); // 初始化动态规划表为-1dp[0][0] = grid[0][0]; // 设置初始值}int dfs(int i, int j) {if (i < 0 || j < 0)return INT_MAX; // 若坐标越界返回INT_MAXif (dp[i][j] != -1)return dp[i][j]; // 若已计算过直接返回结果dp[i][j] = grid[i][j] + min(dfs(i - 1, j), dfs(i, j - 1)); // 动态规划方程return dp[i][j];}int minPathSum(vector<vector<int>>& _grid) {grid = _grid; // 将输入网格赋值给成员变量gridsolveinit(); // 初始化for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (i == 0 && j == 0)continue;dfs(i, j); // 计算每个位置的最小路径和}}return dp[n - 1][m - 1]; // 返回右下角的最小路径和}
};

79. 单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:true

示例 2:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:true

示例 3:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:false

提示:

  • m == board.length

  • n = board[i].length

  • 1 <= m, n <= 6

  • 1 <= word.length <= 15

  • boardword 仅由大小写英文字母组成

进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

1.

正常的dfs搜索题目.

 
class Solution {
public:using ll = long long;vector<vector<char>> board; // 定义二维字符网格boardstring word;                 // 目标单词int n, m;                    // 网格的行数和列数vector<vector<bool>> visited; // 记录访问状态const int dx[4] = {1, -1, 0, 0}; // 右、左、下、上的方向数组const int dy[4] = {0, 0, 1, -1}; // 右、左、下、上的方向数组int index; // 当前匹配到的单词字符索引void solveinit() {n = board.size(); // 获取行数m = board[0].size(); // 获取列数visited.clear(); // 清空访问状态visited.resize(n, vector<bool>(m)); // 初始化访问状态index = 0; // 初始化单词字符索引}bool dfs(int i, int j) {visited[i][j] = true; // 标记当前位置已访问index++; // 单词索引递增if (index == word.size()) {return true; // 单词匹配完成,返回true}for (int k = 0; k < 4; k++) {int x = i + dx[k];int y = j + dy[k];if (x >= 0 && x < n && y >= 0 && y < m && !visited[x][y] &&board[x][y] == word[index]) {if (dfs(x, y))return true; // 深度优先搜索相邻位置}}index--; // 恢复单词字符索引visited[i][j] = false; // 回溯访问状态return false;}bool exist(vector<vector<char>>& _board, string _word) {board = _board; // 将输入网格赋值给成员变量boardword = _word; // 将输入单词赋值给成员变量wordsolveinit(); // 初始化for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (board[i][j] == word[index]) {if (dfs(i, j))return true; // 对每个起点进行深度优先搜索}}}return false; // 未找到匹配的路径,返回false}
};

1143. 最长公共子序列

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

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:text1 = "abc", text2 = "def" 输出:0 解释:两个字符串没有公共子序列,返回 0 。

提示:

  • 1 <= text1.length, text2.length <= 1000

  • text1text2 仅由小写英文字符组成。

 
class Solution {
public:string text1, text2;    // 定义两个字符串text1和text2int n, m;               // 字符串text1和text2的长度vector<vector<int>> dp; // 动态规划表void solveinit() {n = text1.size(), m = text2.size(); // 获取字符串长度dp.clear(), dp.resize(n, vector<int>(m, -1)); // 初始化动态规划表为-1}int dfs(int i, int j) {if (i < 0 || j < 0)return 0; // 越界情况返回0if (dp[i][j] != -1)return dp[i][j]; // 若已计算过直接返回结果if (text1[i] == text2[j]) {dp[i][j] = dfs(i - 1, j - 1) + 1; // 字符相等时更新动态规划表} else {dp[i][j] = max(dfs(i - 1, j), dfs(i, j - 1)); // 字符不等时取左上方和上方的最大值}return dp[i][j];}int longestCommonSubsequence(string _text1, string _text2) {text1 = _text1; // 初始化字符串text1text2 = _text2; // 初始化字符串text2solveinit(); // 初始化for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {dfs(i, j); // 计算最长公共子序列长度}}return dp[n - 1][m - 1]; // 返回最终结果}
};

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

网络安全工程师必备的6个渗透测试工具

渗透测试是模拟黑客攻击&#xff0c;评估系统安全性的重要方法。 网络安全工程师需要掌握各种渗透测试工具&#xff0c;才能有效地发现和修复漏洞。 1. Nmap 功能: 强大的网络扫描器&#xff0c;可以扫描网络拓扑、识别主机和服务、发现开放端口和漏洞。 用途: 信息收集、漏洞…

Ubuntu编译安装MariaDB并进行初始化配置

Ubuntu编译安装MariaDB并进行初始化配置 1. 编译安装MariaDB2. 配置MariaDB3. Docker安装MariaDB 1. 编译安装MariaDB MariaDB官方安装文档&#xff1a;https://mariadb.com/kb/en/Build_Environment_Setup_for_Linux/    下载MariaDB源码&#xff1a;https://mariadb.org/ma…

Springboot + MySQL + html 实现文件的上传、存储、下载、删除

实现步骤及效果呈现如下&#xff1a; 1.创建数据库表&#xff1a; 表名&#xff1a;file_test 存储后的数据&#xff1a; 2.创建数据库表对应映射的实体类&#xff1a; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.Table…

MySQL使用Sequence创建唯一主键

目录 第一章、快速了解Sequence1.1&#xff09;是什么&#xff1f;为什么使用1.2&#xff09;Sequence和自增主键的区别 第二章、在MySQL中使用Sequence2.1&#xff09;创建mysql_sequence表2.1.1&#xff09;创建表2.1.2&#xff09;插入数据 2.2&#xff09;创建函数2.2.1&am…

vue使用debugger调试代码

1.在vue.config.js中 在你的vue文件vue.config.js中找到如下configureWebpack位置&#xff0c;加入devtool:"source map"&#xff0c;重新启动项目debugger即可生效。

分享:9.3版本无缝导入AVEVA PDMS高版本工程12.0,12.1,E3D

9.3版本可以无缝导入AVEVA PDMS的工程。 UKP3d导入AVEVA PDMS工程的方法 http://47.94.91.234/forum.php?modviewthread&tid163583&fromuid6 (出处: 优易软件-工厂设计软件专家) &#xff08;从AVEVA PDMS导出时元件和等级的功能我们正做收尾工作&#xff0c;到时可以…

如何进行制造设备数据汇集,发挥数据的价值?

数字化转型正深刻推动制造企业实现远程监控、提高生产效率、降低生产成本、优化产品质量及明晰精细化方向。并且工业互联网的发展离不开工业数据的应用&#xff0c;而制造设备数据汇集正是应用的基础。但制造设备数据汇集存在以下难点及痛点&#xff1a; 1、安全把控难 关键的…

Mysql基础(一)DDL、DML、DQL、DCL 扫盲之DDL语句

一 扫盲 SQL语句根据其功能主要分为四类&#xff1a;DDL、DML、DQL、DCL说明&#xff1a; 本篇章只会粗略的分类,不会展开细节讲解 1、DDL&#xff08;Data Definition Language&#xff09;说明&#xff1a; 是一组用于定义和管理数据库结构的语句2、DML&#xff08;Data Ma…

RLDP协议原理与应用

RLDP概述 l RLDP全称是Rapid Link Detection Protocol&#xff08;快速链路检测协议&#xff09;&#xff0c;是锐捷网络自主开发的&#xff0c;用于快速检测以太网链路故障的链路协议。 l 一般的以太网链路检测机制都只是利用物理连接的状态&#xff0c;通过物理层的自动协…

张大哥笔记:我付钱了,我就是大爷?

很抱歉用这个当做标题&#xff0c;来给大家分享一些电商的故事&#xff01;大家好&#xff0c;我是张大哥&#xff0c;今天聊聊在电商路上遇到过的奇葩买家&#xff1f; 比如最近我在做PDD的时候&#xff0c;就会遇到很多莫名其妙的sha子&#xff0c;咱是知识份子&#xff0c;肯…

远程桌面连接不上个别服务器的问题分析与解决方案

在日常的IT运维工作中&#xff0c;远程桌面连接&#xff08;RDP&#xff0c;Remote Desktop Protocol&#xff09;是我们经常使用的工具之一&#xff0c;用于管理和维护远程服务器。然而&#xff0c;有时我们可能会遇到无法连接到个别服务器的情况。针对这一问题&#xff0c;我…

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

C语言--贪吃蛇小游戏

目录 一、Win32API介绍 1.1Win32API 1.2控制台程序 1.3控制台屏幕上的坐标COORD 1.4GetStdHandle 1.5GetConsoleCursorInfo 1.6 CONSOLE_CURSOR_INFO 1.7 SetConsoleCursorInfo 1.8SetConsoleCursorPosition 1.9GetAsyncKeyState 二、贪吃蛇游戏设计与分析 2.1地图 …

网站内容下载软件有哪些 网站内容下载软件推荐 网站内容下载软件安全吗 idm是啥软件 idm网络下载免费

一招搞定网页内容下载&#xff0c;并且各大网站通用&#xff01;绕过资源审查&#xff0c;所有网站内容随意下载。解锁速度限制&#xff0c;下载即高速无视网站限速。跳过会员充值&#xff0c;所有VIP资源免费下载。有关网站内容下载软件有哪些&#xff0c;网站内容下载软件推荐…

【leetcode】快慢指针相关题目总结

141. 环形链表 判断链表是否有环&#xff1a;如果链表中存在环&#xff0c;则在链表上不断前进的指针会一直在环里绕圈子&#xff0c;且不能知道链表是否有环。使用快慢指针&#xff0c;当链表中存在环时&#xff0c;两个指针最终会在环中相遇。 /*** Definition for singly-…

Ubuntu-22.04电源选项设置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言说明一、图形设置二、命令行设置1.查看支持的模式2.设置新模式 总结 前言 我们使用Windows都知道电源选项有省电、平衡和高性能模式。其实Ubuntu-22.04也有这个…

【Linux】文件系统

送给大家一句话&#xff1a; 你的任务&#xff0c;就是珍惜你自己的人生&#xff0c;而且还要比之前任何时候更加珍惜。 – 东野圭吾 文件系统 1 前言2 物理磁盘3 磁盘的存储结构4 抽象理解磁盘储存5 引入文件系统 &#xff08;如何管理磁盘文件&#xff09;5.1 了解文件系统5.…

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(六)

目录 第六章 系统测试 6.1 功能性测试 6.1.1 商家后台功能测试 6.1.2 前台功能测试 6.2 非功能性测试 6.3 本章小结 结束语 参考文献 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现&#xff08;五&#xff09; 相关免费源码资源 乐优商城…

深入理解分布式事务① ---->分布式事务基础(四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置)详解

目录 深入理解分布式事务① ---->分布式事务基础&#xff08;四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置&#xff09;详解事务的基本概念1、什么是事务&#xff1f;2、事务的四大特性2-1&#xff1a;原子性&#xff08;Atomic&#xff09…

黑烟车智能电子抓拍系统大幅度节约人力物力

黑烟车智能电子抓拍系统大幅度节约人力物力&#xff0c;之前黑烟车监测通过执勤交警人工现场监测会耗费大量人力物力&#xff0c;效率较低&#xff0c;现在通过黑烟车智能电子抓拍系统可以大辅导提升监测效率&#xff0c;遗漏少&#xff0c;效率高&#xff0c;值得大力推广。 黑…