一个机器人位于一个 M x N M x N MxN 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
题解:
对于一个格子
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j],可由
d
p
[
i
]
[
j
−
1
]
dp[i][j-1]
dp[i][j−1] ,
d
p
[
i
−
1
]
[
j
]
dp[i-1][j]
dp[i−1][j] 转移而来,则dp方程为
d
p
[
i
]
[
j
]
=
d
p
[
i
]
[
j
−
1
]
+
d
p
[
i
−
1
]
[
j
]
dp[i][j] = dp[i][j-1]+dp[i-1][j]
dp[i][j]=dp[i][j−1]+dp[i−1][j]。
代码:
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m+1][n+1];
//这一步其实是为了初始化dp[1][1]
dp[1][0] = 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][n];
}
}
题解二:
这个方法是看官方题解的。
从左上角到右下角的过程中,我们需要移动 m+n-2m+n−2 次,其中有 m-1m−1 次向下移动,n-1n−1 次向右移动。因此路径的总数,就等于从 m+n-2m+n−2 次移动中选择 m-1m−1 次向下移动的方案数,即组合数:
C m + n − 2 m − 1 = ( m + n − 2 m − 1 ) = ( m + n − 2 ) ( m + n − 3 ) ⋯ n ( m − 1 ) ! = ( m + n − 2 ) ! ( m − 1 ) ! ( n − 1 ) ! {\Large C}_{m+n-2}^{m-1} = \binom{m+n-2}{m-1} = \frac{(m+n-2)(m+n-3)\cdots n}{(m-1)!} = \frac{(m+n-2)!}{(m-1)!(n-1)!} Cm+n−2m−1=(m−1m+n−2)=(m−1)!(m+n−2)(m+n−3)⋯n=(m−1)!(n−1)!(m+n−2)!
则可直接给出代码:
class Solution {
public int uniquePaths(int m, int n) {
long ans = 1;
for (int x = n, y = 1; y < m; ++x, ++y) {
ans = ans * x / y;
}
return (int) ans;
}
}