62.不同路径
题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
当m=1和n=1时,只有一种走法。
当m=2,n=2时,需要向右走一步向下走一步,一共需要走2两步,一共2种走法
当m=3,n=3时,需要向右走两步向下走两步,一共要走4步,4步里面选2步向下走,一共6步。
总结之后发现是一个组合问题,一共走m+n-2步,在m+n-2步中选择n-1步向下走。
写了代码试了之后发现溢出了!看来只能想想其他的办法。
思考之后,发现这道题和爬楼梯有相似之处。只不过这个是二维的,爬楼梯是一维的。
假设我们需要到(2,2)去,那么可以先到(2,1)向右走一步,或者先到(1,2)再向下走一步。那么到(2,2)的路径数=(2,1)的路径数+(1,2)的路径数
1.确定dp数组以及下标的含义
dp[m][n] 表示到(m,n)的路径数
2.确定递推公式
dp[m][n] = dp[m][n-1] + dp[m-1][n];
3.dp数组如何初始化
m和n从1开始的,所以m=0或者n=0的dp数组是没有意义的,所以不用初始化
dp[1][1] = 1
dp[1][x] = 1
dp[x][1] = 1
n或者m=1 dp都应该初始化为1,因为只有一条路可以走
4.确定遍历顺序
两层遍历,都是从左到右
5.举例推导dp数组
n=3,m=3
dp[1][1] = 1
dp[1][2] = 1
dp[1][3] = 1
dp[2][1] = 1
dp[2][2] = 2
dp[2][3] = 3
dp[3][1] = 1
dp[3][2] = dp[3][1] + dp[2][2] = 3
dp[3][3] = dp[3][2] + dp[2][3] = 6
代码
class Solution {
public int uniquePaths(int m, int n) {
int [][] dp = new int [m+1][n+1];
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
if(i==1 || j==1) {
dp[i][j] = 1;
continue;
}
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m][n];
}
}