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

embedded/2024/9/23 8:15:46/

🎗️ 主页:小夜时雨
🎗️ 专栏:动态规划
🎗️ 如何活着,是我找寻的方向
优雅

目录

  • 1. 题目解析
  • 2. 代码

1. 题目解析

题目链接: https://leetcode.cn/problems/unique-paths/description/
题目解析
通常动态规划的题目有五个大步骤进行解析, 接下来一一来进行分析.

1. 状态表示
动态规划的重点是在状态表示这里的, 我们通过状态表示才可以写出正确的状态转移方程, 状态表示我们通话吃那个都是根据 经验+题目 要求来进行定义的.
比如本道题是一个二维的矩阵, 那么我们可以定义我们的状态表示为

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

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

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

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

在这里插入图片描述

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

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

原本的dp[0][0] 只有一种路径方式, 也就是 dp[0][0] = 1. 因为我们多加了一行一列, 所以变成了 dp[1][1] = 1. 那么我们只需保证 现在的dp[0][1] = 1 或者 dp[1][0] = 1即可保证后续dp 表中的值都是正确的.
在这里插入图片描述

  1. List item

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

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

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 .。.:*☆


http://www.ppmy.cn/embedded/47123.html

相关文章

git -- 清除本地分支以及删除远程分支

清除本地分支 1. 列出所有分支:你可以列出所有分支来确认你想要删除的分支名。 git branch -a 2. 删除本地分支: 删除已经合并的分支:git branch -d 分支名 -d 参数用于删除已经被合并到当前分支的分支。 强制删除未合并的分支:git branch -D 分支名 -D 参数用于强制删除…

微服务开发与实战Day02 - Docker

一、Docker快速入门 快速构建、运行、管理应用的工具 安装部署教程&#xff1a;Docs 1. 部署MySQL 测试连接&#xff1a; 镜像和容器 当我们利用Docker安装应用时&#xff0c;Docker会自动搜索并下载应用镜像&#xff08;image&#xff09;。镜像不仅包含应用本身&#xff…

C++ PDF转图片

C PDF转图片#include "include/fpdfview.h" #include <fstream> #include <include/core/SkImage.h>sk_sp<SkImage> pdfToImg(sk_sp<SkData> pdfData) {sk_sp<SkImage> img;FPDF_InitLibrary(nullptr);FPDF_DOCUMENT doc;FPDF_PAGE …

数据赋能(116)——体系:数据收集——影响因素、直接作用、主要特征

影响因素 数据收集主要影响因素如下 数据源的质量与可靠性&#xff1a;数据源是数据收集的基础&#xff0c;其质量和可靠性直接影响收集到的数据的价值。如果数据源本身存在错误、不完整或偏差&#xff0c;那么收集到的数据也会受到影响。因此&#xff0c;选择可靠、权威的数…

【Git】分支管理 -- 详解

一、理解分支 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习 C 的时候&#xff0c;另一个你正在另一个平行宇宙里努力学习 JAVA。 如果两个平行宇宙互不干扰&#xff0c;那对现在的你也没啥影响。不过&#xff0c;在某个时间点&#xff0c;两个平行宇宙…

uniapp使用webview内嵌H5的注意事项

一、描述 uniapp项目中构建app&#xff0c;需要内嵌H5页面&#xff0c;在使用webview时&#xff0c;遇到了以下几个问题&#xff1a; 内嵌H5&#xff0c;默认全屏显示&#xff1b;内嵌页面遮挡住了app的自定义tabbar组件&#xff1b;样式修改无效&#xff1b; 二、解决方案&a…

React@16.x(26)useContext

目录 1&#xff0c;上下文的使用2&#xff0c;useContext 1&#xff0c;上下文的使用 之前的文章中介绍过 context上下文。 使用举例&#xff1a; import React, { useState } from "react";const ctx React.createContext();function Child() {return <ctx.C…

易保全网络赋强公证系统,“公证赋强+科技赋能”双重增信

网络赋强公证系统是一种创新的法律服务模式&#xff0c;旨在通过线上方式赋予债权文书强制执行效力。具体来说&#xff0c;该系统结合了互联网技术与公证业务&#xff0c;允许公证机构根据当事人的申请&#xff0c;利用互联网公证技术手段对互联网上的债权文书进行公证&#xf…