LeetCode 算法62 不同路径
题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
解法 1.动态规划
关键:dp[i - 1][j - 1] = dp[i - 1][j] + dp[i][j -1];
到达此点,要么是dp[i - 1][j]向下走一步,要么是dp[i][j - 1]向右走一步
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n));
int i, j;
for(i = 0; i < m; ++i)
dp[i][0] = 1;
for(i = 0; i < n; ++i)
dp[0][i] = 1;
for(i = 1; i < m; ++i){
for(j = 1; j < n; ++j){
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
解法 2.数学组合
从左上角到右下角的过程中,我们需要移动 m+n-2m+n−2 次,其中有 m-1m−1 次向下移动,n-1n−1 次向右移动。因此路径的总数,就等于从 m+n-2m+n−2 次移动中选择 m-1m−1 次向下移动的方案数,即组合数:
class Solution {
public:
int uniquePaths(int m, int n) {
long long ans = 1;
for (int x = n, y = 1; y < m; ++x, ++y) {
ans = ans * x / y;
}
return ans;
}
};