1 题目
1.1 描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
1.2 示例
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
- 1 <= m, n <= 100
- 题目数据保证答案小于等于 2 * 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 题解
2.1 解题方法
动态规划是一种解决数学问题的思维,其出发点是借助于前面计算的结果,从而避免重复计算,进而减少计算量,优化计算模型。
该题是一个最值型动态规划类问题,其解题步骤可分如下四步:
- 1,确定状态
- 最后一步 f[m][n] = f[m - 1][n] + f[m][n - 1]
- 2,转移方程
- i == 0 or j == 0, f[i][j] = 1
- f[i][j] = f[i - 1][j] + f[i][j - 1]
- 3,初始条件和边界情况
- i == 0 or j == 0, f[i][j] = 1
- 4,计算顺序
- 动态规划就是要有效利用前面的计算结果去简化运算,所以运算顺序为从前往后,从上往下逐层计算。
2.2 C++ 实现
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m);
for (int i = 0; i < m; i++) {
dp[i].resize(n);
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 1;
continue;
}
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
2.3 C语言实现
int uniquePaths(int m, int n){
int **dp = (int *)malloc(sizeof(int *) * m);
for (int i = 0; i < m; i++) {
dp[i] = malloc(sizeof(int) * n);
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 1;
continue;
}
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}