【LeetCode】动态规划 刷题训练(二)

news2025/1/18 2:10:57

文章目录

  • 62. 不同路径
    • 题目解析
    • 状态转移方程
    • 完整代码
  • 63. 不同路径 II
    • 题目解析
    • 状态转移方程
    • 完整代码
  • 剑指 Offer 47. 礼物的最大价值
    • 题目解析
    • 状态转移方程
    • 完整代码

62. 不同路径

点击查看:不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

示例 1:
输入:m = 3, n = 7
输出:28
示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

题目解析

只能向下或者向右走,而且不能回退
所以从start到 finish ,共有三种情况

状态转移方程

dp [i,j ] : 表示走到[i, j ]位置时,共有多少条路径

根据最近的一步,划分问题


当处于 [i,j]位置时,可以从 [i-1,j] 位置 向下移动得到

从起点位置开始,移动到[i-1,j]位置上,然后再走一步到达[i,j]位置
从[i-1,j] 到[i,j]的总方法数 等于 从起点到 [i-1,j] 的总方法数 即 dp[i-1,j]


当处于 [i,j]位置时,可以从[i,j-1]位置向右移动得到

从起点位置开始,移动到[i,j-1]位置上,然后再走一步到达[i,j]位置
从[i,j-1] 到[i,j]的总方法数 等于 从起点到 [i,j-1] 的总方法数 即 dp[i,j-1]


状态转移方程为:
dp[i][j]= dp[i-1][j] + dp[i][j-1];

完整代码

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 将 m+1个vector数组 都初始化为 n+1
      vector<vector<int>> dp(m+1,vector<int>(n+1));
       int i=0;
       int j=0;
       //为了防止越界情况,所以扩列 一行和一列,并将其初始化
       dp[0][1]=1;
       for(i=1;i<=m;i++)
       {
           for(j=1;j<=n;j++)
           {
              dp[i][j]=dp[i-1][j]+dp[i][j-1];
           }
       }
       //由于dp是扩列数组,所以下标+1
       return dp[m][n];
    } 
};

通过扩列的方式,进行初始化
多扩出一行和一列,相当于虚拟存在的
因为每个[i,j] 的路径总数 都是由 [i-1,j] 和[i,j-1] 位置 相加得来的
所以在 start 的上一个位置处 将其置为1,其他都置为0,
就可以满足原数组的第一行和第一列都为1

63. 不同路径 II

点击查看:不同路径||

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。

示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

题目解析

与不同路径 1 的区别是 加入了 障碍物

因为中间有障碍物存在,所以只有两种通过方法

状态转移方程

dp[i][j] :表示 从起点到达 [i,j]位置 共有多少 种 方法

若[i,j]位置作为障碍物,则方案作废,方案数为0

若[i,j]位置没有障碍物,可以从 [i-1,j] 位置 向下 达到 [i,j]位置 ,
从起点位置开始,移动到[i-1,j]位置上,然后再走一步到达[i,j]位置
从[i-1,j] 到[i,j]的总方法数 等于 从起点到 [i-1,j] 的总方法数 即 dp[i-1,j]

若[i,j]位置没有障碍物,也可以 从 [i,j-1] 位置 向右达到 [i,j] 位置
从起点位置开始,移动到[i,j-1]位置上,然后再走一步到达[i,j]位置
从[i,j-1] 到[i,j]的总方法数 等于 从起点到 [i,j-1] 的总方法数 即 dp[i,j-1]


状态转移方程为:
dp[i][j] =dp[i-1][j] +dp[i][j-1]; (若[i,j]位置 为 障碍物则为0)

完整代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& ob) {
           int m=ob.size();//行
           int n=ob[0].size();//列

           //将m+1个vector数组 都初始化为n+1
           vector<vector<int>> dp(m+1,vector<int>(n+1));
              
              int i=0;
              int j=0;
              dp[1][0]=1;
              for(i=1;i<=m;i++)
              {
                  for(j=1;j<=n;j++)
                  {
                      //ob作为原数组,映射到扩列后的数组需要行-1 列-1
                      if(ob[i-1][j-1]==0)
                      {
                          //若[i,j]位置不是障碍物
                        dp[i][j]=dp[i-1][j]+dp[i][j-1];
                      }
                  }
              }

              return dp[m][n];
    }
};

依旧需要创建一个扩列的数组,将起点上一个位置 置为1
使原数组第一行和第一列都为1
因为题中所给的ob数组存在障碍物,所以需要借助ob数组 判断 扩列数组的对应位置
若扩列数组位置为[i,j] ,则ob数组为[i-1,j-1] ,该位置若等于1,则为障碍物,其方案数为0

剑指 Offer 47. 礼物的最大价值

点击查看: 礼物的最大价值

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物

题目解析

二维数组的每一个元素对应的数,都表示价值,数越大,价值越大
通过向下 或者 向右 寻找 一条 最大价值的 路径
从最上角的1开始,到最下角的1结束

状态转移方程

dp[i][j]:表示 从起点到 [i,j]位置的时候,能拿到 最大价值的礼物


dp[i][j] 可以分为两种情况


第一种情况 由 [i-1,j] 位置向下走一步得到 [i][j]位置

若从起点到[i-1,j]位置 为当前的 最大价值 ,即dp[i-1][j]
则 再加上当前[i,j]位置对应的数 即为 dp[i][j]的价值
dp[i-1,j]+cost[i,j]


第二种情况 由 [i,j-1] 位置 向右走一步得到 [i][j]位置

若从起点到[i,j-1]位置 为当前的 最大价值 ,即dp[i][j-1]
则加上当前[i,j]位置对应的数 即为 dp[i][j]的价值
dp[i,j-1]+cost[i,j]


将第一种情况的价值与 第二种情况的价值进行比较,取其中大的,则为dp[i][j]的最大价值
dp[i][j]= max(dp[i-1,j]+ cost[i,j] , dp[i,j-1]+ cost[i,j]);

完整代码

class Solution {
public:
    int maxValue(vector<vector<int>>& cost) {
       int m=cost.size();//行
       int n=cost[0].size();//列
       //dp数组 扩列了一行和一列
       vector<vector<int>>dp(m+1,vector<int>(n+1));
       int i=0;
       int j=0;
       for(i=1;i<=m;i++)
       {
           for(j=1;j<=n;j++)
           {
         //cost作为原数组,而dp作为扩列数组,cost想要使用dp数组中的下标,需要减一行减一列
               dp[i][j]=max(dp[i-1][j]+cost[i-1][j-1],dp[i][j-1]+cost[i-1][j-1]);
           }
       }
       //由于是扩列数组,所以返回下标m和n的位置
       return dp[m][n];
    }
};

对于dp数组 start 的位置处,根据状态转移方程,
该位置的最大价值是由 上一个位置以及左一个位置的最大值加上该位置的值 得到的,
但此时 上一个位置以及左一个位置 都是虚拟的,所以理应都设置为0


由于cost数组 是原数组,而dp数组作为扩列数组,cost数组想要dp数组的下标,就需要减一行以及减一列

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

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

相关文章

树莓派与STM32之间串口通信

目录 一、树莓派串口通信模块介绍 二、树莓派蓝牙、串口引脚映射对换步骤 1.启动串口 2. 禁用蓝牙&#xff08;硬件串口与mini串口映射对换&#xff09; 3.验证是否交换成功 三、树莓派安装mini串口调试助手 四、树莓派与电脑串口调试 五、树莓派与STM32串口调试 一、树…

Stable-Diffusion-webui mac m1安装

Stable-Diffusion-webui mac m1安装 推荐下载器&#xff1a;neat download manager 安装git python 3.10 下载地址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui 我这边是通过pycharm 通过git直接拉取到本地的&#xff0c;下载的&#xff0c;最好先建…

使用AI轻松搞定UI设计;a16z:快速高效使用LLM构建应用程序;AI时代99%软件都会消失;豆瓣9.3的经典Python入门书 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; Indeed&#xff1a;美国5月份生成式AI职位发布量增长 20% Indeed 是美国就业门户网站&#xff0c;根据其最新发布的数据显示&#xff…

Golang -> Golang 的概述

Golang 的概述 Golang 的语言的特点Golang 的开发工具Golang 的版本 Golang 的语言的特点 简介&#xff1a; Go 语言保证了既能到达静态编译语言的安全和性能&#xff0c;又达到了动态语言开发维护的高效率 使用一个表达式来形容 Go 语言&#xff1a;Go C Python 说明 Go …

书虫“Bookworm”出山:Debian 版本代号与《玩具总动员》

作为最受欢迎的 Linux 发行版之一&#xff0c;Debian 是许多其他发行版的基础&#xff0c;许多非常受欢迎的 Linux 发行版&#xff0c;例如 Ubuntu、Knoppix、PureOS 、Tails、Armbian 以及 Raspbian&#xff0c;都基于 Debian。 经过近 20 个月的开发&#xff0c;2023 年 6 月…

VMware vCenter Server 8.0U1b 发布下载(重要安全更新)

VMware vCenter Server 8.0U1b 发布下载&#xff08;重要安全更新&#xff09; 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMware vCenter Serve…

【数据网格架构】数据网格架构模式

企业数据网格正在彻底改变企业管理数据的方式。什么是基础数据网格模式&#xff1f; 数据网格模式 企业数据网格正在成为一种独特且引人注目的方式来管理企业内的数据。它将“产品思维”引入企业数据管理&#xff0c;同时在企业中实现更高水平的敏捷性和数据治理。它创造了一种…

行为型模式--迭代器模式

目录 概述 结构 案例实现 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 概述 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xff08;Aggregate&#xf…

【裸机开发】IRQ 中断服务函数(二)—— 全局中断初始化

实现了 IRQ 中断服务函数的汇编部分以后&#xff0c;接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑&#xff0c;主要包含初始化和中断处理两部分。 全局中断初始化&#xff08;全局中断使能、IRQ中断使能&#xff09;具体中断处理逻辑实现 目录 一、全局中断初始化&am…

【C++】第14章: C++中的代码重用

第十四章 C中的代码重用 文章目录 第十四章 C中的代码重用引言14.1 valarray类简介14.1.1 接口和实现14.1.2 C和约束14.1.3 初始化顺序 14.2 has a14.2.1 组合14.2.2 私有继承14.2.2.1 访问基类的方法14.2.2.2 访问基类对象14.2.2.3 访问基类的友元函数 14.2.3 使用组合还是私有…

【软件工程导论】从已考完期末的角度记录软导常考内容

文章目录 软件工程概念软件过程模型&#xff08;了解&#xff09;软件生存周期划分数据流图内聚与耦合的种类UML中的主要图及其作用MVC模式MVVM模式黑盒测试白盒测试白盒测试法的逻辑覆盖标准 软件工程概念 什么是软件工程&#xff1f;它的目标和内容是什么&#xff1f; 软件工…

无处不在 | 亚马逊云科技的 Java 生态

Java 自诞生以来就一直是热门的编程语言。得益于丰富的生态以及完善维护的包和框架&#xff0c;Java 拥有着庞大的开发者社区。这个 1995 年诞生的计算机语言&#xff0c;以 “一次编写&#xff0c;到处运行” 的跨平台特性以及面向对象、泛型编程等现代语言的特性迅速成为了企…

企业如何通过精细化管理实现高质量增长?

增量经济时代&#xff0c;各行各业都有比较充足的发展机会&#xff0c;即使采取相似的发展模式、提供同质化的产品和服务&#xff0c;也都会获得收益和增长。当前&#xff0c;我国开始步入存量经济时代&#xff0c;增量空间正逐步被压缩&#xff0c;这将对区域格局、产业组织结…

【NLP】PageRank、TextRank算法的原理解析

一、说明 PageRank是经典的网页热度评分算法&#xff0c;在自然语言的热词提取也有同样的意义&#xff08;TextRank&#xff09;&#xff1b;本文详细叙述该算法的原理&#xff0c;配合部分代码演示其原理。 二、PageRank算法的启发因素 2.1 算法兴起 PageRank (PR) 是…

HDLBits笔记6:Circuits.Combinational Logic.Multiplexers + Arithmetic Circuits

Multiplexers 2-to-1 multiplexer module top_module( input a, b, sel,output out ); assign out sel ? b : a; endmodule2-to-1 bus multiplexer module top_module( input [99:0] a, b,input sel,output [99:0] out );assign out sel ? b : a; endmodule9-to-1 multi…

逍遥自在学C语言 | 多级指针探秘

前言 多级指针在C语言中是一种特殊的指针类型&#xff0c;它可以指向其他指针的指针。 通过多级指针&#xff0c;我们可以间接地访问或修改存储在内存中的数据。 在本文中&#xff0c;我们将讨论多级指针的概念、使用方法、使用场景以及常见错误及其避免方法。 一、人物简介…

软件项目管理 第六章 软件项目的进度管理 课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第六章 软件项目的进度管理 课后习题参考答案 1.选择题 (1)快速跟进是指&#xff08;A&#xff09;。 A.采用并行执行任务,加速项目进展 B.用一个任务取代另外的任务 C.如有可能,减少任务数量 D.减轻项目风险 (2)赶工一个任务时&#xff0c;…

相机畸变概述

上节说到了相机模型,那么这节说说相机的畸变 如果有手机爱好者,听到很多测评进行测评的时候,都会提到一个词,广角防畸变,啥意思,举个栗子 来看下信号塔,是不是已经开始歪了,这就是0.6倍,超广角模式下的畸变(其实一倍也畸变,小声BB) 为啥会畸变呢,仔细看镜头,镜头是曲面的,光…

CDN和DNS

目录 宽带&#xff0c;窄带&#xff0c;带宽区别和联系如何计算带宽带宽和网速的区别和联系 CDNCDN的原理CDN的好处CDN和通信行业DNS和CDN的区别与联系用户访问未使用CDN缓存网站的过程为使用了CDN缓存后的网站的访问过程变为 CDN加速服务 DNSDNS对好处公共 DNS114 DNS阿里DNS百…

Mac安装配置Visual Studio Code(vscode)以及Java环境详细教程(初学者必看)

原本博主今天想继续给大家出Java接下来的教程,但是就在昨天我在配置vscode的时候遇到了一些问题,Windows系统的小伙伴配置起来肯定很方便,但是在Mac的小伙伴却显得十分无奈,所以我想给大家出一篇Mac的Visual Studio Code配置以及Java环境搭建教程&#xff01; 博客主页:Jovy.的…