【动态规划】| 路径问题之不同路径 力扣62

🎗️ 主页:小夜时雨

🎗️ 专栏:动态规划

🎗️ 如何活着,是我找寻的方向

目录

  • [1. 题目解析](#1. 题目解析)
  • [2. 代码](#2. 代码)

1. 题目解析

题目链接: https://leetcode.cn/problems/unique-paths/description/

通常动态规划的题目有五个大步骤进行解析, 接下来一一来进行分析.

1. 状态表示

动态规划的重点是在状态表示这里的, 我们通过状态表示才可以写出正确的状态转移方程, 状态表示我们通常都是根据 经验+题目 要求来进行定义的.

比如本道题是一个二维的矩阵, 那么我们可以定义我们的状态表示为

dpij: 表示走到 (i, j) 这个位置时, 一共有多少条不同的路径

合适的状态表示才能很顺利正确的推导出状态转移方程, 所以要积累经验定义出合适的状态表示.

2. 状态转移方程

根据题目要求, 假如我们走到了 (i,j) 位置时, 我们可以从上面往下走或者是从左面往右走, 即是从 (i-1, j) 或者 (i, j-1) 往 (i, j) 的位置走.

根据状态表示, dpij 的大小可以由两部分组成, 既然问的是不同路径, 那么共有两条不同的路径: 从左往右走或者从上往下走, 二者之间应该是和的关系. 从 (0, 0) 走到 (i-1, j) 共有多少种方式, 那么从 (0, 0) 走到 (i, j) 也有多少种方式, 正好所对应的就是 dpi - 1j 所表示的含义. 同理 dpij - 1 也是. 那么状态转移方程应如下表示:

dpij = dpi - 1j + dpij - 1

3. 初始化

细节问题: 观察状态转移方程可知, 有可能会有越界的风险, 此处我们采取一种多加一行一列的方式来进行初始化.

多加一行一列要保证两点:

  1. 虚拟节点的值要保证后面的dp 表里的值是正确的
  2. 要注意下标的映射关系. 因为我们是多加了一行一列, 所以对应到原始数组就应该行列要减一

原本的dp00 只有一种路径方式, 也就是 dp00 = 1. 因为我们多加了一行一列, 所以变成了 dp11 = 1. 那么我们只需保证 现在的dp01 = 1 或者 dp10 = 1即可保证后续dp 表中的值都是正确的.

4. 填表顺序

观察可知, 填 (i, j) 的值的时候需要用到上一行和左边的值. 所以填表顺序是 从上往下, 从左往右.

5. 返回值

根据题目的要求, 要到达(m, n) 共有多少不同的路径, 正好对应 dpmn 的表示. 所以返回 dpmn 即可.

2. 代码

动态规划的代码编写一般都是分为 4 个步骤进行:

  1. 创建 dp 表
  2. 初始化
  3. 填表
  4. 返回值
java 复制代码
// 这道题即可以使用记忆化搜索, 也可以使用动态规划
    // 时间复杂度都是 O(M*N)
    public int uniquePaths(int m, int n) {
        // 1.创建 dp表
        // 2.初始化
        // 3.填表
        // 4.返回值
        // 动态规划 这里的是二维, 所以时空都是O(M*N)

        int[][] dp = new int[m + 1][n + 1];
        dp[0][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];
    }

🎗️🎗️🎗️ 好啦,到这里有关本题的分享就没了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

相关推荐
灿飞屋12 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
石小石Orz12 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
xiaoye-duck13 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
NE_STOP13 小时前
Spring AI Alibaba - MCP入门
java
nice_lcj52013 小时前
【从零理解 Spring AI · 07】对话记忆:让模型记住上一句说了什么
java·spring ai·ai应用开发·chatmemory·对话记忆
总要学点什么14 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
田甲14 小时前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
民乐团扒谱机14 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
SL_staff14 小时前
制造业交付崩盘?用跨部门节点协同计划打通销售、生产与质量链路
java·开源·产品
青少儿编程课堂14 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛