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

【第38天】不同路径数问题 | 网格 dp 入门

本文已收录于专栏
🌸《Java入门一百例》🌸

学习指引

  • 序、专栏前言
  • 一、网格模型
  • 二、【例题1】
    • 1、题目描述
    • 2、解题思路
    • 3、模板代码
    • 4、代码解析
    • 5.原题链接
  • 三、【例题2】
    • 1、题目描述
    • 2、解题思路
    • 3、模板代码
    • 4、代码解析
    • 5.原题链接
  • 三、推荐专栏
  • 四、课后习题

序、专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Java,特别是一些Java学习者难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
   但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
   算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
  学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。

一、网格模型

   网格模型是一个很经典的模型,也可以称之为数字三角形模型。其一般形态就是在一个二维的网格中,以左上角为起点,到右下角为终点,只能往下走或者往右走。求得这个过程中可以获取的不同路径数或者权值最大最小问题,当然如何移动也要根据题意来分析,在转移时亦是如此。今天将带来两道最入门的网格dp入门题。

二、【例题1】

1、题目描述

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

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

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

2、解题思路

   定义 f[i][j]f[i][j]f[i][j] 为走到 iiijjj 列的不同路径数,显然 iiijjj 列只能从i−1i-1i1jjj 列和iiij−1j-1j1 列走过来,那么具有转移方程:
f[i][j]=f[i−1][j]+f[i][j−1]f[i][j]=f[i-1][j]+f[i][j-1]f[i][j]=f[i1][j]+f[i][j1]
初始化时f[1][1]f[1][1]f[1][1]应该等于1,答案即是f[m][n]f[m][n]f[m][n]

3、模板代码

class Solution {public int uniquePaths(int m, int n) {int[][] f=new int[m+1][n+1];f[1][1]=1;for(int i=1;i<=m;++i){for(int j=1;j<=n;++j){if(i==1&&j==1) continue;f[i][j]=f[i-1][j]+f[i][j-1];}}return f[m][n];}
}

使用滚动数组优化:

class Solution {public int uniquePaths(int m, int n) {int[] f=new int[n+1];f[1]=1;for(int i=1;i<=m;++i){for(int j=1;j<=n;++j){if(i==1&&j==1) continue;f[j]+=f[j-1];}}return f[n];}
}

4、代码解析

滚动数组优化,也是二维dp里常用的优化方式,可以帮忙我们压缩一维空间,不太理解暂时不建议深究。
为了防止边界越界问题,这里大家 iii jjj 都从1开始,如果从0的话在转移时会出现越界。

5.原题链接

不同路径

三、【例题2】

1、题目描述

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

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

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

2、解题思路

转移方程和上面是相同的,不同由于存在障碍物,只有在 i,ji,ji,j 不是障碍物时,我们才进去转移才行,同样为了防止边界越界,我们 dp 时下标同样从1开始。

3、模板代码

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m=obstacleGrid.length;int n=obstacleGrid[0].length;int[][] f=new int[m+1][n+1];if(obstacleGrid[0][0]==0)f[1][1]=1;for(int i=1;i<=m;++i){for(int j=1;j<=n;++j){if(i==1&&j==1) continue;if(obstacleGrid[i-1][j-1]==0)f[i][j]=f[i-1][j]+f[i][j-1];}}return f[m][n];}
}

4、代码解析

注意起点有可能有石头,初始化时需要进行判断。

5.原题链接

不同路径||
在这里插入图片描述

三、推荐专栏

🌌《零基础学算法100天》🌌

四、课后习题

序号题目链接难度评级
1 最小路径和3
👇 学习有疑问?👇
http://www.lryc.cn/news/2590.html

相关文章:

  • LINUX之链接命令
  • 1628_MIT 6.828 xv6_chapter0操作系统接口
  • 使用 Sahi 实现 Web 自动化测试
  • 天津菲图尼克科技携洁净及无菌防护服解决方案与您相约2023生物发酵展
  • Java 网络编程详解
  • Scratch少儿编程案例-几何形式贪吃蛇
  • 一定要收藏的面试思维导图,粉丝分享面试经验
  • 【博客615】通过systemd设置cgroup来限制服务资源争抢
  • C语言经典编程题100例(21-40)
  • Rabbitmq业务难点
  • 服务器如何下载百度网盘文件?Linux服务器如何在百度网盘中连接、上传下载;在Linux服务器上下载百度云盘中的资料
  • Cesium-数字仿真-你总要了解
  • 原型、原型链、__proto__与prototype的区别、继承
  • 前端 面经
  • [oeasy]python0080_设置RGB颜色_24bit_24位真彩色_颜色设置
  • 实战项目-用户评论数据情绪分析
  • day02 DOS(续)文本编辑快捷键 发展史
  • arm64与aarch64
  • QString详解
  • SpringCloud微服务
  • Hive 连接及使用
  • android libavb深入解读
  • 【面试题】对闭包的理解?什么是闭包?
  • 笔试题-2023-乐鑫-数字IC设计【纯净题目版】
  • antd日期组件时间范围动态跟随
  • mysql一条sql语句的执行过程
  • SaaS是什么,和多租户有什么关系?
  • C语言---字符串函数总结
  • MySQL-表的基本操作
  • 开篇之作—闲聊几句AUTOSAR