【算法历练】动态规划副本—路径问题

news2024/11/19 3:43:38

                                               🎬慕斯主页:修仙—别有洞天

                                              ♈️今日夜电波:宙でおやすみ

                                                                1:02━━━━━━️💟──────── 2:45
                                                                    🔄   ◀️   ⏸   ▶️    ☰   

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


 

目录

62.不同路径

解题思路:

63.不同路径||

解题思路:

LCR 166.珠宝的最高价值

解题思路:

931.下降路径最小和

解题思路:

64.最小路径和

解题思路:


62.不同路径

62. 不同路径

        一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

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

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。对于二维dp我们可以按照以[i,j]为结尾时,巴拉巴拉 的模板来进行描述。本题的状态表示为:dp[i][j]表示:走到[i,j]位置时,一共有多少种方式。

2、状态转移方程:根据题意,我们按照最近的一步划分问题。可知有两种最近的一步,即:

因此,我们可以根据上述的思想写出状态转移方程:

3、初始化(重点):在这里需要根据状态转移表示进行初始化,根据上面的状态转移方程,我们可以知道如果直接初始化需要将dp[0][j]、dp[i][0]都等于1才能完成初始化。但是我们在这里多加一横多加一列来初始化,让初始化更简单,也是防止越界。可以根据下图理解:

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

        因此我们写出如下题解:

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m+1,vector<int>(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];
    }
};

63.不同路径||

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. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。本题是上一题的拓展,只是多了一个障碍而已。本题的状态表示为:dp[i][j]表示:走到[i,j]位置时,一共有多少种方式。由于多了一个障碍,我们只需要加上一个判断:if(obstacleGrid[i-1][j-1]!=1)即可规避障碍。

2、状态转移方程:实际上还是和上一题一样的,即:dp[i][j]=dp[i-1][j]+dp[i][j-1];

3、初始化(重点):同上一题

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

        因此我们写出如下题解:(需要注意我们的dp表是加了一行一列的,因此对于obstacleGrid要对应上需要横和列都-1)

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> dp(obstacleGrid.size()+1,vector<int>(obstacleGrid[0].size()+1));
        dp[0][1]=1;
        for(int i=1;i<=obstacleGrid.size();i++)
        {
            for(int j=1;j<=obstacleGrid[0].size();j++)
            {
                if(obstacleGrid[i-1][j-1]!=1)
                {
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
        }
        return dp[obstacleGrid.size()][obstacleGrid[0].size()];
    }
};

LCR 166.珠宝的最高价值

LCR 166. 珠宝的最高价值

        现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:

  • 只能从架子的左上角开始拿珠宝
  • 每次可以移动到右侧或下侧的相邻位置
  • 到达珠宝架子的右下角时,停止拿取

注意:珠宝的价值都是大于 0 的。除非这个架子上没有任何珠宝,比如 frame = [[0]]。

示例 1:

输入: frame = [[1,3,1],[1,5,1],[4,2,1]]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最高价值的珠宝

提示:

  • 0 < frame.length <= 200
  • 0 < frame[0].length <= 200

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。因此写出状态表示:dp[i][j]表示:到达[i,j]位置时,此时的最大值。

2、状态转移方程:根据题意,我们可知只能向左或者向右移动即:

每次移动都会拿珠宝,因此写出状态转移方程:

3、初始化(重点):我们多加上一横以及一列让初始化更简单,也是防止越界。根据题意,我们可以发现:要使dp表正确,我们仅需将dp[0][j]、dp[i][0]初始化为0即可,如下图示:

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

因此我们写出如下题解:

class Solution {
public:
    int jewelleryValue(vector<vector<int>>& frame) {
        int n=frame.size();
        int m=frame[0].size();
        vector<vector<int>> dp(n+1,vector<int>(m+1));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dp[i][j]=max(dp[i-1][j],dp[i][j-1])+frame[i-1][j-1];
            }
        }
        return dp[n][m];

    }
};

931.下降路径最小和

931. 下降路径最小和

        给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 最小和

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1:

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100


解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。状态表示为:dp[i][j]表示: 到达[i,j]位置是,最小的下降路径。

2、状态转移方程:dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+matrix[i-1][j-1];如何d得出来的呢?我们可以从[i-1,j-1]->[i,j] [i-1,j]->[i,j] [i-1,j+1]->[i,j] 可以得出如下:

3、初始化(重点):根据题意,我们可以发现:要使dp表正确,我们需要多加一横以及两列,并且将最左的以及最右的两列初始化为最大,第一横初始化为0。(简化操作:现将全部初始化最大,第一横初始化为0)如下图所示:

4、填表顺序:从上往下

5、返回值:最后一横的最小值。

因此我们写出如下题解:

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int n=matrix.size(),m=matrix[0].size();
        vector<vector<int>> dp(n+1,vector<int>(m+2,INT_MAX));
        for(int i=0;i<m+2;i++)
        {
            dp[0][i]=0;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+matrix[i-1][j-1];
            }
        }
        int min=INT_MAX;
        for(int j=1;j<=m;j++)
        {
            if(min>dp[n][j])
            min=dp[n][j];
        }
        return min;
    }
};

64.最小路径和

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

解题思路:

1、状态表示:我们根据经验加题目要求,很明显的看出本题是一个二维数组的dp。dp[i][j] 表示:达到[i,j]位置,最小路径和。

2、状态转移方程: dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i-1][j-1];

3、初始化(重点):多加一横以及一列,我们需要保证里面的值要保证后面的值是正确的。因此我们将所有值都先初始化为最大值,再将dp[0][1]或者dp[1][0]初始化为0即可。后续也需要注意下标的映射关系。

4、填表顺序:从上往下,从左往右填写。

5、返回值:dp[i][j]

因此我们写出如下题解:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<int>> dp(n+1,vector<int>(m+1,INT_MAX));
        dp[0][1]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i-1][j-1];
            }
        }
        return dp[n][m];
    }
};

 


                      感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

现在在市场上云主机一般多少钱?影响其价格的因素有哪些

现在很多人都会购买云主机来帮助自己存储一些数据&#xff0c;但是很多人在购买云主机的时候最担心的就是云主机的价格。 由于很多人担心云服务器的价格会很高&#xff0c;因此一直在密切关注目前市场上各品牌云主机的相关价格。 下面就给大家详细介绍一下现在市场上一台云主机…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

若依Vue3:新一代前后端分离权限管理系统

若依Vue3&#xff1a;新一代前后端分离权限管理系统 随着技术的不断进步&#xff0c;前后端分离的开发模式逐渐成为主流&#xff0c;特别是在构建权限管理系统时。在这样的背景下&#xff0c;若依Vue3应运而生&#xff0c;作为基于Spring Boot、Spring Security、JWT、Vue3、V…

【C++】树形关联式容器set、multiset、map和multimap的介绍与使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.关联式容器 2.键…

二叉搜索树在线OJ题讲解

二叉树创建字符串 我们首先进行题目的解读&#xff1a; 大概意思就是用&#xff08;&#xff09;把每个节点的值给括起来&#xff0c;然后再经过一系列的省略的来得到最后的结果 大家仔细观察题目给出的列子就可以发现&#xff0c;其实这个题目可以大致分为三种情况&#xff1…

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…

[linux][xdp] xdp 入门

xdp 全称 eXpress Data Path&#xff0c;是 linux ebpf 中的一个功能。ebpf 在内核中预留了一些插入点&#xff0c;用户可以在这些插入点插入自己的处理逻辑&#xff0c;当数据路过插入点时可以做一些预期的处理&#xff0c;具体实现方式如下&#xff1a; ① 用户编写数据处理…

【C++私房菜】序列式容器的迭代器失效问题

目录 一、list的迭代器失效 二、vector的迭代器失效 1、空间缩小操作 2、空间扩大操作 三、总结 在C中&#xff0c;当对容器进行插入或删除操作时&#xff0c;可能会导致迭代器失效的问题。所谓迭代器失效指的是&#xff0c;原先指向容器中某个元素的迭代器&#xff0c;在…

尚硅谷webpack5笔记2

Loader 原理 loader 概念 帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块。 loader 执行顺序 分类pre: 前置 loadernormal: 普通 loaderinline: 内联 loaderpost: 后置 loader执行顺序4 类 loader 的执行优级为:pre > normal > inline > post 。相…

在Node.js中如何实现用户身份验证和授权

当涉及到构建安全的应用程序时&#xff0c;用户身份验证和授权是至关重要的一环。在Node.js中&#xff0c;我们可以利用一些流行的库和技术来实现这些功能&#xff0c;确保我们的应用程序具有所需的安全性。本篇博客将介绍如何在Node.js中实现用户身份验证和授权。 用户身份验…

密码学系列(四)——对称密码2

一、RC4 RC4&#xff08;Rivest Cipher 4&#xff09;是一种对称流密码算法&#xff0c;由Ron Rivest于1987年设计。它以其简单性和高速性而闻名&#xff0c;并广泛应用于网络通信和安全协议中。下面是对RC4的详细介绍&#xff1a; 密钥长度&#xff1a; RC4的密钥长度可变&am…

精品springboot相亲网站预约

《[含文档PPT源码等]精品基于springboot相亲网站[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;HTML5,CSS3、Ja…

在Golang中简化日志记录:提升性能和调试效率

最大化效率和有效故障排除&#xff1a;在Golang中简化日志记录 日志记录是软件开发的一个基本方面&#xff0c;有助于调试、监控和理解应用程序的流程。在Golang中&#xff0c;有效的日志记录实践可以显著提高性能并简化调试过程。本文探讨了优化Golang日志记录的技术&#xf…

常用git 打tag命令

1.查看所有tag git tag 2.创建 v5.0.0的tag git tag v5.0.0 git tag &#xff08;创建后查看&#xff09; 3.推送到远程tag git push origin v5.0.0 4.删除远程tag git push origin --delete v5.0.0 5.删除本地tag git tag -d v5.0.0 6.添加带有备注信息的tag git tag v5.…

SpringCloud认识微服务

文章目录 1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 微服务架构是一种架构模式&…

Qcom camera hal简介

目录 背景 Android相机软件框架 Qcom HAL主要包括Camx和Chi两部分 Camx中Pipeline 和 node 下图是简单模型的pipeline (sensor --> IFE --> IPE --> SinkTarget) Pipeline中的buffer管理 IFE output port的buffer在Camx中申请 IPE output port使用的buffer来自…

JavaEE进阶(7)Spring Boot 日志(概述、用途、使用:打印日志,框架介绍,SLF4J 框架介绍、更简单的日志输出)

接上次博客&#xff1a;JavaEE进阶&#xff08;6&#xff09;SpringBoot 配置文件&#xff08;作用、格式、properties配置文件说明、yml配置文件说明、验证码案例&#xff09;-CSDN博客 目录 日志概述 日志的用途 日志使用 打印日志 在程序中获取日志对象 使用日志对象…

Twing模板注入 [BJDCTF2020]Cookie is so stable1

打开题目 我们先抓包分析一下 可以输入{{7*7}}处发包试一下 可以看到在cookie处存在ssti模板注入 输入{{7*‘7’}}&#xff0c;返回49表示是 Twig 模块 输入{{7*‘7’}}&#xff0c;返回7777777表示是 Jinja2 模块 在这里可以看出是Twing模块 我们直接用固定payload就可以…

【STM32】STM32学习笔记-修改主频 睡眠模式 停止模式 待机模式(45)

00. 目录 文章目录 00. 目录01. PWR简介02. 修改主频接线图03. 修改主频相关API04. 修改主频程序示例05. 睡眠模式接线图06. 睡眠模式相关API07. 睡眠模式程序示例08. 停止模式接线图09. 停止模式相关API10. 停止模式程序示例11. 待机模式接线图12. 待机模式相关API13. 待机模式…

算法:动态规划全解(上)

一、动态规划初识 1.介绍 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。 例如&#xff1a;有N件物品…