当前位置: 首页 > news >正文

力扣 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];}
};

相关文章:

力扣 hot100 -- 多维动态规划

&#x1f447;woc&#xff0c;这不是最熟悉那种&#xff0c;记忆化 dfs 或者 普通的深度优先搜索&#xff1f;&#xff1f;都适用于二维地图&#x1f447; DFS&#xff08;深度优先搜索&#xff09;8种题型_dfs典型问题-CSDN博客 目录 &#x1f943;不同路径 &#x1f33c;最…...

[misc]-流量包-wireshark-icmp

wireshark打开&#xff0c;大部分都是icmp,查看data部分 提取data长度&#xff1a; tshark.exe -r 1.pcapng -T fields -e data.len > length.txt 使用python解析这个文件&#xff0c;剔除异常值&#xff0c;每8个取一个值&#xff0c;得到flag ds [] with open(length.tx…...

探索性数据分析:使用Python与Pandas库实现数据洞察

探索性数据分析&#xff1a;使用Python与Pandas库实现数据洞察 引言 在当今数据驱动的时代&#xff0c;数据分析已成为决策制定、策略规划和业务优化的关键环节。无论是商业智能、金融分析还是市场研究&#xff0c;数据分析都扮演着至关重要的角色。Pandas库作为Python生态系统…...

枚举的高阶用法之枚举里写方法以及注入spring的bean

1、前言 一般我们使用枚举都是用来定义一些常量。比如我们需要一个表示订单类(pc订单、手机订单)的常量,那我们就可以使用枚举来实现,如下: AllArgsConstructor public enum OrderTypeEnum{PC("PC", "电脑端"),PHONE("PHONE", "手机端&quo…...

游戏开发面试题2

网络游戏分为客户端和服务端&#xff0c;你能说说客户端和服务端都干了一些什么工作吗&#xff1f; 客户端&#xff08;Client&#xff09; 客户端是玩家直接交互的部分&#xff0c;主要负责用户界面、输入处理、渲染和部分逻辑处理。具体工作包括&#xff1a; 用户界面&…...

华为机试题-单车道汽车通行时间-Java

代码在最后面 1 题目描述 M&#xff08;1 ≤ M ≤ 20&#xff09;辆车需要在一条不能超车的单行道到达终点&#xff0c;起点到终点的距离为 N&#xff08;1 ≤ N ≤ 400&#xff09;。 速度快的车追上前车后&#xff0c;只能以前车的速度继续行驶&#xff0c;求最后一辆车到达…...

6-5,web3浏览器链接区块链(react+区块链实战)

6-5&#xff0c;web3浏览器链接区块链&#xff08;react区块链实战&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 这里就是浏览器端和智能合约的交…...

C# 多态性

C# 多态性 介绍 多态性是面向对象编程(OOP)的一个核心概念,它允许不同类的对象对同一消息做出响应,并产生不同的结果。在C#中,多态性主要通过继承、接口和虚方法来实现。本文将深入探讨C#中的多态性,包括其原理、实现方式以及在实际编程中的应用。 原理 多态性允许将…...

Visual Studio 安装程序无法执行修复或更新

一.问题场景 出现问题的场景&#xff1a;当你的VS已经安装但是无法在工具中下载新组件或者卸载了当时一直无法安装。 二.问题原因 如果计算机上的 Visual Studio 实例已损坏&#xff0c;则可能会出现此问题。 三.解决方法 如果之前尝试修复或更新 Visual Studio 失败&…...

C#与PLC通信——如何设置电脑IP地址

前言&#xff1a; 我们与PLC通过以太网通信时&#xff0c;首先要做的就是先设置好电脑的IP&#xff0c;这样才能实现上位机电脑与PLC之间的通信&#xff0c;并且电脑的ip地址和PLC的Ip地址要同处于一个网段&#xff0c;比如电脑的Ip地址为192.168.1.1&#xff0c;那么PLC的Ip地…...

Milvus 核心设计(1) ---- 数据一致性的等级及使用场景

目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…...

EasyCVR视频技术:城市电力抢险的“千里眼”,助力抢险可视化

随着城市化进程的加速和电力需求的不断增长&#xff0c;电力系统的稳定运行对于城市的正常运转至关重要。然而&#xff0c;自然灾害、设备故障等因素常常导致电力中断&#xff0c;给城市居民的生活和企业的生产带来严重影响。在这种情况下&#xff0c;快速、高效的电力抢险工作…...

【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS

局域网设备访问WampServer 参考&#xff1a;https://www.jianshu.com/p/d431a845e5cb 修改Apache的httpd.conf文件 D:\Academic\Wamp\program\bin\apache\apache2.4.54.2\conf\httpd.conf 搜索 Require local 和Require all denied&#xff0c;改为Require all granted <…...

采用自动微分进行模型的训练

自动微分训练模型 简单代码实现&#xff1a; import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的线性回归模型 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear nn.Linear(1, 1) …...

k8s怎么配置secret呢?

在Kubernetes中&#xff0c;配置Secret主要涉及到创建、查看和使用Secret的过程。以下是配置Secret的详细步骤和相关信息&#xff1a; ### 1. Secret的概念 * Secret是Kubernetes用来保存密码、token、密钥等敏感数据的资源对象。 * 这些敏感数据可以存放在Pod或镜像中&#x…...

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示...

数据库作业d8

要求&#xff1a; 一备份 1 mysqldump -u root -p booksDB > booksDB_all_tables.sql 2 mysqldump -u root -p booksDB books > booksDB_books_table.sql 3 mysqldump -u root -p --databases booksDB test > booksDB_and_test_databases.sql 4 mysql -u roo…...

前后端数据交互设计到的跨域问题

前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000&#xff0c;后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…...

非洲猪瘟监测设备的作用是什么?

TH-H160非洲猪瘟监测设备的主要作用是迅速、准确地检测出非洲猪瘟病毒&#xff0c;从而帮助控制和预防疫情的扩散。这些设备利用先进的生物传感技术和PCR分子生物学方法&#xff0c;能够在极短的时间内提供精确的检测结果<sup>1</sup><sup>2</sup><…...

移动硬盘损坏无法读取?专业恢复策略全解析

在数字化信息爆炸的今天&#xff0c;移动硬盘作为我们存储和传输大量数据的重要工具&#xff0c;其安全性和稳定性直接关系到个人与企业的数据安全。然而&#xff0c;当移动硬盘突然遭遇损坏&#xff0c;无法正常读取时&#xff0c;我们该如何应对&#xff1f;本文将深入探讨移…...

神经网络以及简单的神经网络模型实现

神经网络基本概念&#xff1a; 神经元&#xff08;Neuron&#xff09;&#xff1a; 神经网络的基本单元&#xff0c;接收输入&#xff0c;应用权重并通过激活函数生成输出。 层&#xff08;Layer&#xff09;&#xff1a; 神经网络由多层神经元组成。常见的层包括输入层、隐藏层…...

java中压缩文件的解析方式(解析文件)

背景了解&#xff1a;java中存在IO流的方式&#xff0c;支持我们对文件进行读取&#xff08;Input&#xff0c;从磁盘到内存&#xff09;或写入&#xff08;output&#xff0c;从内存到磁盘&#xff09;&#xff0c;那么我们在面对 “zip”格式或者 “rar” 格式的压缩文件&…...

巧用 VScode 网页版 IDE 搭建个人笔记知识库!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述&#xff1a;最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记&#xff0c;考虑到在线 VScode 支持终…...

Jupyter Lab 使用

Jupyter Lab 使用详解 Jupyter Lab 是一个基于 Web 的交互式开发环境&#xff0c;提供了比 Jupyter Notebook 更加灵活和强大的用户界面和功能。以下是使用 Jupyter Lab 的详细指南&#xff0c;包括安装、基本使用、设置根目录和扩展功能等内容。 一、Jupyter Lab 安装与启动…...

MyBatis where标签内嵌foreach标签查询报错‘缺失右括号‘或‘命令未正确结束‘

MyBatis <where>标签内嵌<foreach>标签查询报错’缺失右括号’或’命令未正确结束’ <where>标签内嵌<foreach>标签 截取一段脱敏xml&#xff0c;写明大概意思 <select id"queryLogByIds" resultMap"BaseResultMap">SELE…...

重生奇迹MU 群战王牌

圣导师是重生奇迹MU游戏中八大职业之一&#xff0c;拥有风度翩翩、潇洒自如的形象和神一样的实力。无论是刷怪、PK、打boss还是混战&#xff0c;圣导师都表现出压制其他职业的强大气势。因此&#xff0c;这个职业在游戏中备受欢迎&#xff0c;人气非常高。 实力强大的二代隐藏…...

SpinalHDL之VHDL 和 Verilog 生成

本文作为SpinalHDL学习笔记第十六篇&#xff0c;记录使用SpinalHDL代码生成Verilog/VHDL代码的方法。 SpinalHDL学习笔记总纲链接如下&#xff1a; SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客 目录&#xff1a; 1.从 SpinalHDL 组件生成 VHDL 和 Verilog 2.生成的 VHD…...

c语言中的字符串函数

strstr函数 函数介绍 strstr 用于在一个字符串中查找另一个字符串的首次出现。 我们来看这个函数的参数名字&#xff1a;haysytack&#xff08;干草堆&#xff09;needle&#xff08;针&#xff09;,这个其实就是外国的一句谚语&#xff1a;在干草堆中找一根针&#xff0c;就…...

[AI 大模型] 百度 文心一言

文章目录 [AI 大模型] 百度 文心一言简介模型架构发展新技术和优势API 代码示例 [AI 大模型] 百度 文心一言 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DwAIh0T-1720667576892)(https://i-blog.csdnimg.cn/direct/283919e5d78b4951ba1ade5dcfc…...

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么&#xff1f; github代码介绍文章 在药物发现中&#xff0c;如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…...