news 2026/6/10 13:19:57

LeetCode动态规划经典题:Unique Paths 网格路径计数详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode动态规划经典题:Unique Paths 网格路径计数详解

这道题是典型的动态规划入门题,非常适合练习二维 DP 的建模思路。leetcode+1

题目概述

在一个 m×n 的网格上,有一个机器人从左上角 (0,0) 出发,只能向右或向下移动一步。leetcode

目标是到达右下角 (m−1,n−1),要求计算一共有多少条不同的路径。leetcode

约束:1≤m,n≤100,测试数据保证答案不超过 2×10^9。leetcode

动态规划建模

状态定义:令 dp[i][j] 表示从起点 (0,0) 走到格子 (i,j) 的不同路径数量。leetcode

状态含义:每个格子只可能从上方 (i-1,j) 或左方 (i,j-1) 走到,因此到达当前格子的路径数等于来自这两个方向路径数之和。leetcode+1

状态初始化

起点:dp[0][0] = 1,表示机器人一开始就在这个格子上,只有 1 种方式"到达"自己。leetcode

第一行:对于 i = 0, j > 0,由于只能向右走,所以 dp[0][j] = dp[0][j - 1]。leetcode

第一列:对于 j = 0, i > 0,由于只能向下走,所以 dp[i][0] = dp[i - 1][0]。leetcode

在代码中,这些初始化逻辑是通过统一的循环和条件分支实现的,而不是单独写两层专门初始化第一行第一列:

dp[0][0]=1;for(i=0;i<m;i++){for(j=0;j<n;j++){if(i==0&&j==0)continue;if(i==0)dp[i][j]=dp[i][j-1];elseif(j==0)dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[i][j-1];}}

状态转移方程

对于一般位置 (i, j) 且 i > 0, j > 0:

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

对于第一行:

dp[j]=dp[j−1]

对于第一列:

dp[i]=dp[i−1]

用一句话概括:到达当前格子的路径数 = 来自上方的路径数 + 来自左方的路径数。leetcode

完整实现与返回值

使用 m * n 的二维数组 dp 存储所有状态,先用 malloc 分配空间并初始化为 0。leetcode

填表顺序:外层遍历行 i,内层遍历列 j,根据上面规则更新 dp[i][j]。leetcode

最终答案是右下角格子的状态值:dp[m - 1][n - 1]。leetcode

代码中将该值保存到 result,然后释放二维数组内存,最后 return result:

result=dp[m-1][n-1];for(i=0;i<m;i++)free(dp[i]);free(dp);returnresult;

复杂度与优化思路

时间复杂度:每个格子只被计算一次,共 m×n 个格子,所以是 O(mn)。leetcode

空间复杂度:使用 m * n 的二维数组存储 dp 状态,空间复杂度为 O(mn)。leetcode

优化方向:由于每次转移只依赖当前行和上一行(或当前列和上一列),可以进一步使用一维数组实现空间优化到 O(n) 或 O(m),这是常见的 follow-up。虽然当前版本使用的是二维 dp,但逻辑上已经为一维优化打下基础。leetcode

这篇博客从题意、状态设计到代码实现和复杂度分析,完整展示了如何用二维动态规划解决 Unique Paths 这类网格路径计数问题。通过这道题,可以系统地练习:如何定义状态、如何写出清晰的 base case、以及如何把转移关系翻译成代码。leetcode+1

参考链接

  • LeetCode Unique Paths - Problem Description
  • LeetCode Unique Paths - My Submission
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:14:42

【毕业设计】机器学习基于深度学习的土豆疾病识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 11:16:12

内驱力:点燃自我成长的发动机

你是否曾有过这样的经历:被外在压力推着走时倍感疲惫,而发自内心想要做一件事时却充满能量?这背后起作用的就是内驱力——那个无需外力推动、却能让每个人持续前进的内心发动机。 内驱力是什么? 内驱力是一种源自内心的动力,它让我们主动追求成长、学习和进步。与外部的…

作者头像 李华
网站建设 2026/6/10 12:58:24

Python代码实现示例解析

代码实现 以下是一个实现[输入代码要求]的[输入编程语言]代码示例&#xff1a; def example_function(input_data):"""示例函数&#xff1a;实现[输入代码要求]参数&#xff1a;input_data: 输入数据返回&#xff1a;处理后的结果"""# 初始化结…

作者头像 李华
网站建设 2026/6/10 12:59:50

linux 设置tomcat开机启动

在Linux系统中&#xff0c;要配置Tomcat开机自启动&#xff0c;可以创建一个名为 tomcat.service 的 systemd 服务文件&#xff0c;并将其放置在 /etc/systemd/system/ 目录下。以下是一个基本的服务文件示例&#xff0c;假设Tomcat安装在 /usr/local/tomcat 路径下&#xff1a…

作者头像 李华
网站建设 2026/6/9 23:10:14

C++内存序

在 C 中&#xff0c;内存序&#xff08;Memory Order&#xff09;是多线程编程中原子操作的重要概念&#xff0c;它用于控制原子操作的内存同步行为。C11 引入了 <atomic> 头文件&#xff0c;提供了内存序来控制多线程环境下的内存访问顺序。内存序的作用内存序主要解决两…

作者头像 李华