62.不同路径

题目

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?
 62.不同路径_数组

示例 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];
    }
}