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

动态规划 之 路径问题 算法专题

一. 不同路径

不同路径

  1. 状态表示
    dp[i][j] 表示走到[i][j]位置, 有几种不同的路径
  2. 状态转移方程
    以离[i][j] 最近的位置划分问题
    1.从[i - 1][j] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i - 1][j]位置的不同路径数相同, 即dp[i][j] = dp[i - 1][j]
    2.从[i][j - 1] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i ][j - 1]位置的不同路径数相同, 即dp[i][j] = dp[i][j - 1]
  • dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  1. 初始化
    使用优化的思想进行初始化, 添加虚拟节点
    在第一行和第一列的位置填表时会发生越界
    所以需要添加一行一列
    在这里插入图片描述
    我们只需要像上表一样初始化虚拟节点, 就可以正确的进行填表

  2. 填表顺序
    从上往下 从左往右

  3. 返回值
    返回dp[m][n]

class Solution {public int uniquePaths(int m, int n) {//1. 创建表//2. 初始化//3. 填表//4. 返回值int[][] dp = new int[m + 1][n + 1];dp[0][1] = 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][n];}
}

二. 不同路径II

不同路径II

  1. 状态表示
    dp[i][j] 表示走到[i][j]位置, 有几种不同的路径
  2. 状态转移方程
    以离[i][j] 最近的位置划分问题
    1.从[i - 1][j] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i - 1][j]位置的不同路径数相同, 即dp[i][j] = dp[i - 1][j]
    2.从[i][j - 1] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i ][j - 1]位置的不同路径数相同, 即dp[i][j] = dp[i][j - 1]
    但是如果此时的[i][j]是障碍物, 那么到达这个位置的路径数就为0, 所以dp[i][j] = 0
  • dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  1. 初始化
    使用优化的思想进行初始化, 添加虚拟节点
    在第一行和第一列的位置填表时会发生越界
    所以需要添加一行一列
    在这里插入图片描述
    我们只需要像上表一样初始化虚拟节点, 就可以正确的进行填表

  2. 填表顺序
    从上往下 从左往右

  3. 返回值
    返回dp[m][n]

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {//1. 创建表//2. 初始化//3. 填表//4. 返回值int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m + 1][n + 1];dp[0][1] = 1;for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(obstacleGrid[i - 1][j - 1] == 1) {dp[i][j] = 0;}else{dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m][n];}
}

三. 珠宝的最高价值

珠宝的最高价值

  1. 状态表示
    dp[i][j] 表示走到[i][j]位置, 获得的珠宝的最高价值是多少
  2. 状态转移方程
    以离[i][j] 最近的位置划分问题
    到[i][j]位置的获得的珠宝的最高价值 就是到[i - 1][j]位置的获得的珠宝的最高价值 与 到[i][j - 1]位置的获得的珠宝的最高价值 的最大值, 然后加上[i][j]位置本来的价值
  • dp[i][j] = max(dp[i - 1][j] + dp[i][j - 1]) + frame[i - 1][j - 1](采用优化的思想, 与原下标对应要 - 1)
  1. 初始化
    使用优化的思想进行初始化, 添加虚拟节点
    在第一行和第一列的位置填表时会发生越界
    所以需要添加一行一列
    我们只需要将虚拟节点都设为0即可
  2. 填表顺序
    从上往下 从左往右
  3. 返回值
    返回dp[m][n]
class Solution {public int jewelleryValue(int[][] frame) {//1. 创建dp//2. 初始化//3. 填表//4. 返回值int m = frame.length;int n = frame[0].length;int[][] dp = new int[m + 1][n + 1];for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];}}return dp[m][n];}
}

四. 下降路径最小和

下降路径最小和

  1. 状态表示
    dp[i][j] 表示走到[i][j]位置, 路径的最小和
  2. 状态转移方程
    以离[i][j] 最近的位置划分问题
    到[i][j]位置的路径的最小和 就是到[i - 1][j - 1]位置路径的最小和 与 到[i - 1][j]位置路径的最小和 与 [i - 1][j + 1]位置路径的最小和 的最小值, 然后加上[i][j]位置本来的值
  • dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i - 1][j - 1](采用优化的思想, 与原下标对应要 - 1)
  1. 初始化
    使用优化的思想进行初始化, 添加虚拟节点
    在第一行和第一列和最后一列的位置填表时会发生越界
    所以需要添加一行两列
    我们需要将虚拟节点都设为最大值, 防止对原来的数进行干扰
  2. 填表顺序
    从上往下 从左往右
  3. 返回值
    返回最后一行中的最小值
class Solution {public int minFallingPathSum(int[][] matrix) {//1. 创建dp//2. 初始化//3. 填表//4. 返回值int n = matrix.length;int[][] dp = new int[n + 1][n + 2];for(int i = 1; i <= n; i++){dp[i][0] = Integer.MAX_VALUE;dp[i][n + 1] = Integer.MAX_VALUE;}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i - 1][j - 1];}}int min = Integer.MAX_VALUE;for(int j = 1; j <= n; j++){min = Math.min(min, dp[n][j]);}return min;}
}

五. 最小路径和

最小路径和

  1. 状态表示
    dp[i][j] 表示走到[i][j]位置, 路径的最小和
  2. 状态转移方程
    以离[i][j] 最近的位置划分问题
    到[i][j]位置的路径的最小和 就是到[i - 1][j]位置路径的最小和 与 [i][j - 1]位置路径的最小和 的最小值, 然后加上[i][j]位置本来的值
  • dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1](采用优化的思想, 与原下标对应要 - 1)
  1. 初始化
    使用优化的思想进行初始化, 添加虚拟节点
    在第一行和第一列的位置填表时会发生越界
    所以需要添加一行一列
    我们需要将虚拟节点设为最大值, 但是[0][1]位置的值要设为0, 防止对原来的数进行干扰
  2. 填表顺序
    从上往下 从左往右
  3. 返回值
    dp[m][n]
class Solution {public int minPathSum(int[][] grid) {// 1. 创建dp// 2. 初始化// 3. 填表// 4. 返回值int m = grid.length;int n = grid[0].length;int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) {dp[i][0] = Integer.MAX_VALUE;}for (int j = 0; j <= n; j++) {dp[0][j] = Integer.MAX_VALUE;}dp[0][1] = 0;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];}}return dp[m][n];}
}

六. 地下城游戏

地下城游戏

  1. 状态表示
    dp[i][j] 如果表示走到[i][j]位置, 所需要的最小血量, 是没办法完成这道题的, 因为, 每走一步, 所需的最小血量都在更新
    所以dp[i][j] 表示从[i][j]位置开始, 所需要的最小血量
  2. 状态转移方程
    以离[i][j] 最近的位置划分问题
    1.[i][j]位置所需要的最小血量 + [i][j]位置需要加或减的血量 一定是要 >= 到[i + 1][j]位置所需要的最小血量, 才能保证走下一个位置的时候不会死, 所以dp[i][j] = dp[i + 1][j] - 原表的[i][j]
    2.[i][j]位置所需要的最小血量 + [i][j]位置需要加或减的血量 一定是要 >= 到[i][j + 1]位置所需要的最小血量, 才能保证走下一个位置的时候不会死, 所以dp[i][j] = dp[i][j + 1] - 原表的[i][j]
  • dp[i][j] = Math.min(dp[i + 1][j], dp[i][j + 1]) - 原表的[i][j]
    但是我们得出的dp[i][j] 必须是>0的, 如果<0, 就设为1, 所需要的最低血量
  1. 初始化
    使用优化的思想进行初始化, 添加虚拟节点
    在最后一行和最后一列的位置填表时会发生越界
    所以需要添加一行一列
    我们需要将虚拟节点设为最大值, 但是[m][n - 1]位置 和[m - 1][n]位置 的值要设为1, 所需要的最低血量
  2. 填表顺序
    从下往上 从右往左
  3. 返回值
    dp[0][0]
class Solution {public int calculateMinimumHP(int[][] dungeon) {// 1. 创建dp// 2. 初始化// 3. 填表// 4. 返回值int m = dungeon.length;int n = dungeon[0].length;int [][] dp = new int[m + 1][n + 1];for(int i = m; i >= 0; i--){dp[i][n] = Integer.MAX_VALUE;}for(int j = n; j >= 0; j--){dp[m][j] = Integer.MAX_VALUE;}dp[m][n - 1] = dp[m - 1][n] = 1;for(int i = m - 1; i >= 0; i--){for(int j = n - 1; j >=0; j--){dp[i][j] = Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];dp[i][j] = Math.max(1, dp[i][j]);}}return dp[0][0];}
}

相关文章:

动态规划 之 路径问题 算法专题

一. 不同路径 不同路径 状态表示 dp[i][j] 表示走到[i][j]位置, 有几种不同的路径状态转移方程 以离[i][j] 最近的位置划分问题 1.从[i - 1][j] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i - 1][j]位置的不同路径数相同, 即dp[i][j] dp[i - 1][j] 2.从[i][j - 1] 到[i…...

从office套件接入GPT4谈自动化测试的前景

微软前几天发布了集成了GPT-4模型的office套件&#xff0c;从演示视频看&#xff0c;大概可以做这样一些事情 输入指令自动做表输入指令写邮件输入指定自动做ppt&#xff0c;而且一做就是好多页&#xff0c;挺震撼的 稍微了解了一下原理&#xff0c;大概流程是 用户发送prom…...

CentOS操作系统安装过程简介

以下是在CentOS&#xff08;以CentOS 7为例&#xff09;中使用Anaconda安装器的一般步骤&#xff1a; 1. 准备工作 - 首先&#xff0c;需要获取CentOS 7的安装介质&#xff0c;可以是光盘或者制作好的USB启动盘。然后将计算机设置为从对应的安装介质启动。 2. 启动安装程序 -…...

基于Multisim光控夜灯LED电路(含仿真和报告)

【全套资料.zip】光控夜灯LED电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.采用纯数字电路&#xff0c;非单片机。 2.通过检测周围光线&#xff0c;光线暗且有声音时自动开灯…...

导师双选系统开发:Spring Boot技术详解

第一章 绪论 1.1 选题背景 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;尽管身边每时每刻都在产生大量信息&#xff0c;这些信息也都会在短时间内得到处理&#xff0c;并迅速传播。因为很多时候&#xff0c;管理层决策需要大量信…...

双11花了“一部手机钱”买手机壳的年轻人,究竟在买什么?

【潮汐商业评论/原创】 这个双十一&#xff0c;Elsa在天猫多了一笔新支出——手机壳。和大家都熟悉的“义乌制造”不同的是&#xff0c;她的手机壳支出单件就已经到了500块&#xff0c;加上配套的手机链、支架、卡包、耳机壳&#xff0c;总共1000多元&#xff0c;足够买一部学…...

rediss数据结构及其底层实现

Redis 是一个基于内存的高性能键值对数据库&#xff0c;它支持多种数据结构&#xff0c;每种数据结构都有其特定的底层实现。以下是Redis中一些主要数据结构及其底层实现&#xff1a; 字符串&#xff08;String&#xff09;&#xff1a; Redis的字符串类型使用简单动态字符串&a…...

自动化测试中使用Pytest Fixture?推荐10种常见用法!

Pytest 是一个功能强大的 Python 测试框架&#xff0c;其中的Fixture 是 Pytest 中的一个重要功能。它允许你设置一些特定的测试环境或准备测试数据&#xff0c;这些环境和数据可以在多个测试用例中重复使用。通过使用fixture&#xff0c;你可以避免在每个测试函数中编写重复的…...

Spring中的ConversionService,为Spring提供数据转换服务

在Spring中经常需要各种数据类型之间进行转换&#xff0c;比如配置文件中的数据转换为代码所需要的数据类型&#xff0c;在使用SpringMvc的时候&#xff0c;将前台传来的参数自动转换为我们接收参数时定义的类型。 Spring中的ConversionService就是提供这种服务的 1.DefaultC…...

gdb和make工具

gdb工具&#xff1a; GDB的主要功能 断点设置&#xff1a;允许开发者在特定的代码行设置断点&#xff0c;当程序执行到该行时会自动暂停&#xff0c;方便开发者进行调试和分析。 变量查看与修改&#xff1a;在程序运行过程中&#xff0c;可以查看和修改变量的值&#xff0c;以…...

【d66】【Java】【力扣】174.寻找二叉搜索树中的目标节点

思路 反着的中序遍历&#xff0c;并计数 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNo…...

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo&#xff0c;有网友留言如下图&#xff1a; 针对网友的留言&#xff0c;那么我们如何解决这个问题呢 Spring-Boot应用停机时&#xff0c;如何保证其内存消息都处理完成&#xff1f; 2.解决方法 方法其实挺简单的&…...

HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解

文章目录 1. 标题标签2. 段落标签3. 文本格式化标签4. 列表标签4.1 无序列表 `<ul>`4.2 有序列表 `<ol>`5. 引用标签5.1 块引用 `<blockquote>`5.2 行内引用 `<q>`5.3 作品引用 `<cite>`6. 代码和预格式文本标签6.1 代码标签 `<code>`6.2 …...

高效管理社团:Spring Boot在校园社团信息管理中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理校园社团信息管理系统的相关信息成为必然。…...

mysql约束和高级sql

约束 MySQL中的约束用于定义表中数据的规则&#xff0c;以确保数据的准确性和可靠性。以下是MySQL中常用的一些约束类型及其概述&#xff1a; PRIMARY KEY&#xff08;主键&#xff09;&#xff1a;唯一标识表中每条记录的字段或字段组合&#xff0c; 一个表中只能有一个主键…...

蓝桥杯真题——三角回文数(C语言)

问题描述 对于正整数 n, 如果存在正整数 k 使得 n123⋯kk(k1)2n123⋯kk(k1)/2​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯36366066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数…...

uni-app 封装图表功能

文章目录 需求分析1. 秋云 uchars2. Echarts 需求 在 uni-app 中使用图表功能&#xff0c;两种推荐的图表工具 分析 在 Dcloud市场 搜索Echarts关键词&#xff0c;会出现几款图表工具&#xff0c;通过大家的下载量&#xff0c;可以看到秋云这个库是比较受欢迎的&#xff0c;其…...

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一&#xff0c;什么是pod1.1pod在k8s中使用方法&#xff08;1&#xff09;使用方法一&#xff08;2&#xff09;使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理&#xff08;1&#xff09;pause容器的作用 1.4 Pod分类&#xff1a;&#xff08;1&#xff09;自主式…...

QT创建按钮篇

QT创建按钮篇 1.概述 这篇文章从创建一个按钮对QT开发流程熟悉。 2.代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) { // 第一种创建按钮方式 // QPushButton *btn new QPushButton(); /…...

初级软件测试工程师就别出口喊15K了,连自动化测试都不会,还不如应届生

一. 为什么学软件测试 零基础转行&#xff0c;为什么首选软件测试&#xff1f; 软件测试是软件开发的重要过程之一&#xff0c;是软件质量的保证。国外信息技术领域软件开发人员与测试人员的比例是1:1&#xff0c;而国内目前专业软件测试人员很少&#xff0c;属于紧缺型人才&a…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...