力扣—不同路径(路径问题的动态规划)

文章目录

题目解析

算法原理

  1. 状态表示
    对于这种「路径类」的问题,我们的状态表示⼀般有两种形式:
    i. 从[i, j] 位置出发。
    ii. 从起始位置出发,到[i, j] 位置。
    这⾥选择第⼆种定义状态表⽰的⽅式:
    dp[i][j] 表示:⾛到[i, j] 位置处,⼀共有多少种⽅式。
  2. 状态转移⽅程:
    简单分析⼀下。如果dp[i][j] 表示到达[i, j] 位置的⽅法数,那么到达[i, j] 位置之
    前的⼀小步,有两种情况:
    i. 从[i, j] 位置的上方( [i - 1, j] 的位置)向下走⼀步,转移到[i, j] 位置;
    ii. 从[i, j] 位置的左方( [i, j - 1] 的位置)向右走⼀步,转移到[i, j] 位置。
    由于我们要求的是有多少种⽅法,因此状态转移⽅程就呼之欲出了:
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 。
  3. 初始化:
    可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
    i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
    ii. 「下标的映射关系」。
    在本题中,「添加⼀⾏」,并且「添加⼀列」后,只需将dp[0][1] 的位置初始化为1 即可。
  4. 填表顺序:
    根据「状态转移⽅程」的推导来看,填表的顺序就是「从上往下」填每⼀⾏,在填写每⼀⾏的时候「从左往右」。
  5. 返回值:
    根据「状态表示」,我们要返回dp[m][n] 的值。

代码实现

java 复制代码
class Solution {
    public int uniquePaths(int m, int n) 
    {
        int[][] dp=new int[m+1][n+1];
        //dp数组加一行和加一列是防止dp[i-1]越界访问
        dp[0][1]=1;//因为数组的一行和第一列的元素必须要等于1,为什么是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];
    }
}

题目练习

不同路径||

java 复制代码
class Solution 
{
 public int uniquePathsWithObstacles(int[][] ob) 
 {
 
     int m = ob.length, n = ob[0].length;
     int[][] dp = new int[m + 1][n + 1];
     dp[1][0] = 1;//第一行第一列设置为1,因为第一行和第一列都只能左移或者向下移动,只有一种方式,所以设置为1
      for(int i = 1; i <= m; i++)
      for(int j = 1; j <= n; j++)
     if(ob[i - 1][j - 1] == 0)//因为数组初始化为int[m + 1][n + 1];原来的[0][0]下标变为了[1][1]下标,
     //下标的映射关系发生了改变
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
 return dp[m][n];
 }
}

珠宝的的最大价值
下降路径最小和
最小路径和

完。

相关推荐
gfdhy5 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
百***06015 小时前
SpringMVC 请求参数接收
前端·javascript·算法
一个不知名程序员www6 小时前
算法学习入门---vector(C++)
c++·算法
云飞云共享云桌面6 小时前
无需配置传统电脑——智能装备工厂10个SolidWorks共享一台工作站
运维·服务器·前端·网络·算法·电脑
福尔摩斯张6 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
橘颂TA6 小时前
【剑斩OFFER】算法的暴力美学——两整数之和
算法·leetcode·职场和发展
Dream it possible!7 小时前
LeetCode 面试经典 150_二叉搜索树_二叉搜索树的最小绝对差(85_530_C++_简单)
c++·leetcode·面试
xxxxxxllllllshi7 小时前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
前端小L7 小时前
图论专题(二十二):并查集的“逻辑审判”——判断「等式方程的可满足性」
算法·矩阵·深度优先·图论·宽度优先
铁手飞鹰7 小时前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先