动态规划解决LeetCode 62题:不同路径问题
1. 题目链接
LeetCode 62. 不同路径
2. 题目描述
一个机器人位于一个 m x n
网格的左上角(起点标记为“Start”)。机器人每次只能向右或向下移动一步。机器人试图达到网格的右下角(标记为“Finish”)。问总共有多少条不同的路径?
示例:
- 输入:
m = 3
,n = 7
- 输出:
28
3. 示例分析
以 m = 2
, n = 2
为例,机器人需要从 (0,0)
移动到 (1,1)
,可能的路径有两条:
- 向右 -> 向下
- 向下 -> 向右
动态规划表格初始化后,每个位置的值表示到达该位置的路径数。通过逐步填充表格,最终得到右下角的值即为答案。
4. 算法思路
动态规划状态定义
- 定义
dp[i][j]
表示从起点(0,0)
到达(i-1, j-1)
位置的路径数(这里i
和j
从1
开始,避免越界)。
状态转移方程
- 每个位置的路径数等于上方和左方位置的路径数之和:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
初始化技巧
- 初始化
dp[0][1] = 1
,使得当计算dp[1][1]
时,能够正确推导出初始值1
。通过这种方式,无需单独处理第一行和第一列的初始化。
5. 边界条件与注意事项
- 网格维度为 1x1:直接返回
1
。 - 网格只有一行或一列:路径数始终为
1
。 - 索引处理:由于
dp
数组的维度为(m+1) x (n+1)
,遍历时需从i=1
和j=1
开始。
6. 代码实现
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));dp[0][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];}
};
代码解析
- 初始化:
dp[0][1] = 1
使得dp[1][1] = 1
,无需单独处理第一行或列。 - 双重循环:按行优先顺序填充表格,确保每个位置的上方和左方已被计算。
- 返回值:最终结果存储在
dp[m][n]
,对应右下角的位置。
通过动态规划方法,时间复杂度为 O(mn)
,空间复杂度为 O(mn)
。此方法直观且易于理解,适合处理中等规模的网格路径问题。