题目如下:
解题思路:
方法一:
这实际上就是一道数学上的排列组合题,向右走 m-1 步,向下走 n-1 步,怎么组合来走,就是求 C(m+n-2,m-1) 。
代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {
//排列组合问题C(m+n-2,m-1)
long res = 1;
long k = min(m,n) - 1;
long v = m + n -2;
//C(v,k)
for(int i = 1; i <= k; v--, i++)
res = res * v / i;
//注意要对i从小到大的除,若i是从大到小,因为除法结果取整的问题
//可能出现C(7,3) = (7/3)*(6/2)*(5/1) = 2*3*5 = 30 != 35,导致结果错误
return res;
}
};
方法二:
这道题实际上也可以用动态规划来做,dp[i][j] = dp[i-1][j] + dp[i][j-1] 。令 dp[i][j] 代表
到达 (i, j) 最多的路径,对于第一行 dp[0][j] ,或者第一列 dp[i][0] ,由于都是在边界,所以只能为 1。
代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {
//动态规划问题,公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]
vector<vector<int>> dp(n, vector<int> (m));
for(int i = 0; i < n; i++) //边界初始化为1
dp[i][0] = 1;
for(int i = 1; i < m; i++) //边界初始化为1
dp[0][i] = 1;
for(int i = 1; i < n; i++)
for(int j = 1; j < m; j++)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
return dp[n-1][m-1];
}
};