62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
Examle
input |
---|
m = 3, n = 2 |
output |
3 |
input |
---|
m = 7, n = 3 |
output |
28 |
Note
- 1 < = m , n < = 100 1 <= m, n <= 100 1<=m,n<=100
- 题目数据保证答案小于等于 2 ∗ 1 0 9 2 * 10 ^ 9 2∗109
思路
- 第一眼想到 d f s dfs dfs,看了下数据范围,明显超时
- 然后想到 d p dp dp, d p [ i ] [ j ] = d [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=d[i-1][j]+dp[i][j-1] dp[i][j]=d[i−1][j]+dp[i][j−1];
- 或者数学里面的排列组合 C m + n − 2 m − 1 C_{m+n-2}^{m-1} Cm+n−2m−1
代码如下
dp
class Solution {
public: int s[101][101];
public:
int uniquePaths(int m, int n) {
memset(s,0,sizeof(s));
for(int i=1;i<=m;i++)
s[i][1]=1;
for(int i=1;i<=n;i++)
s[1][i]=1;
for(int i=2;i<=m;i++)
{
for(int j=2;j<=n;j++)
{
s[i][j]=s[i-1][j]+s[i][j-1];
}
}
return s[m][n];
}
};
排列组合
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;
}
};