题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
解题思路
思路:这道题和上面那道题很类似,只不过这题求的是有多少种不同的路径,只需要稍微改变一下递推式就可以,这题的递推式实际上就是对从上面走过来的可能和从左边走过来的可能
进行求和,即dp[i][j]=dp[i-1][j]+dp[i][j-1]
代码
class Solution {
public int uniquePaths(int m, int n) {
if (m == 1 && n == 1) return 1;
int[][] dp = new int[m][n];
dp[0][0] = 0;
// 初始化行
for (int i = 1; i < n; i++){
dp[0][i] = 1;
}
// 初始化列
for (int i = 1; i < m; i++){
dp[i][0] = 1;
}
// 求解dp
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-1][n-1];
}
}
这里不初始化也可以,直接在求解dp时候做边界判断:
- 若没有上侧格子,则
dp[i][j]=dp[i][j-1]
- 若没有左侧格子,则
dp[i][j]=dp[i-1][j]
- 上侧左侧都有,则
dp[i][j]=dp[i-1][j]+dp[i][j-1]
- 上侧左侧都没有,也就是左上角,
dp[i][j]=1