# 不同路径

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

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

问总共有多少条不同的路径?

示例 1:

img

输入: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

# 思路分析:动态规划

我们先来分析一下如下格子 有几种走法

image-20240109132812259

第一种走法:先 向右 走一步,再向下走两步

image-20240109132842095

第二种走法:先向下两步,再向右走一步

image-20240109132938739

第三种走法:先向下走一步,再向右走一步,再向下走一步

image-20240109133019090

我们现在知道了 3 行 2 列的格子一共有 3 种走法,那么 这三种是怎么来的呢。下面继续拆解

我们先假设格子就这么大,就两个格子大小

image-20240109133131320

那么这时的走法总数 只有一种

image-20240109133236168

还有一种情况如下格子是如下这么画的 它的走法总数是几?

image-20240109133320579

也是 1,这时它只能向下走,所以也只有一种走法

image-20240109133412119

现在我们把范围扩大到 4 个格子,这时它要走到右下角有几种走法

image-20240109133438459

有 2 种走法,要么它从下面走过来,要么它从上面走过来

这里有个规律这 2 种走法是怎么来的呢,其实就是 第一种走法 + 第二种走法 = 2

image-20240109133540355

下面如果格子是这样画的,那么它走到右下角的走法还是 1 种

image-20240109133705301

现在我们把格子范围扩大到整个

image-20240109133759190

那么到达右下角的走法总数就是 前两个走法数 相加 就是 3

规律:右下角它的走法总数就是,右下角它上方的 格子的 走法数 和 左方的走法数 它们的和就是 最终右下角的结果

image-20240109133853490

​ 第一行和第一列它们的走法都是 1 种

image-20240109134610014

public static void main(String[] args)
{
   System.out.println(new Demo04().updatePaths(3, 7));
}
public int updatePaths(int m, int n)
{
   // 创建一个 m 行 n 列 的二维数组
   int dp[][] = new int[m][n];
   // 第一种走法 右边都是 1
   for(int i = 0; i < m; i++)
   {
      dp[i][0] = 1;
   }
   // 第一种走法 下边都是 1
   for(int j = 0; j < n; j++)
   {
      dp[0][j] = 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 - 1][n - 1];
}