题目
给定一个 m x n 的网格,机器人位于网格的左上角,每次只能向下或向右移动一步,求问机器人走到网格的右下角一共有多少种路径。
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
原题链接:https://leetcode-cn.com/problems/unique-paths/
思路
动态规划。设 dp[i][j] 表示机器人走到 (i, j) 的位置有多少种路径。由于机器人只能向下或向右走,那么机器人走到 (i, j) 只会从 (i-1, j) 或 (i, j-1) 过来,那么转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1]
而第一行和第一列,都只有一种走法,故初始化其为 1。
- 复杂度分析
- 时间复杂度 O(m x n)
- 空间复杂度 O(m x n)。PS:由于 dp[i][j] 只和 i-1 或 j - 1 相关,即当前状态只和上一次状态有关。dp数组其实可以只用大小为 2m 或 2n 来表示,空间复杂度可以降为O(min(m, n))。这里偷懒,就先不写了。。。
代码
class Solution {
public:
int uniquePaths(int m, int n) {
// 直接初始化全为1
vector<vector<int>> dp(m, vector<int>(n, 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 - 1][n - 1];
}
};
本文解析了如何利用动态规划解决LeetCode上的独特路径问题,通过示例和代码展示了机器人在网格中从左上角到右下角的不同走法。介绍了转移方程和空间复杂度优化技巧,是动态规划入门的好例子。

35

被折叠的 条评论
为什么被折叠?



