不同路径——1
一个机器人位于一个 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
解题思路·:
由于机器人只能向下或向右移动,要到达网格中的某个特定位置 (i, j)
,它只能从该位置的上方 (i - 1, j)
或者左方 (i, j - 1)
移动过来。这就意味着到达位置 (i, j)
的不同路径数量与到达其上方和左方位置的不同路径数量有关,设 dp[i][j]
表示机器人从网格的左上角 (0, 0)
移动到位置 (i, j)
的不同路径数量。这里 i
表示行索引,范围是 0
到 m - 1
;j
表示列索引,范围是 0
到 n - 1
。对于第一行的任意位置 (0, j)
(j
从 0
到 n - 1
),因为机器人只能从左上角一直向右移动才能到达这些位置,所以到达这些位置的路径只有一种,即 dp[0][j] = 1
。对于第一列的任意位置 (i, 0)
(i
从 0
到 m - 1
),因为机器人只能从左上角一直向下移动才能到达这些位置,所以到达这些位置的路径也只有一种,即 dp[i][0] = 1
。通过上述状态转移方程,我们可以从 (1, 1)
位置开始,按照行优先或者列优先的顺序依次计算出网格中每个位置的 dp
值。最终,dp[m - 1][n - 1]
就表示机器人从左上角 (0, 0)
移动到右下角 (m - 1, n - 1)
的不同路径数量。
具体代码:
import java.util.Scanner; public class UniquePaths { public static int uniquePaths(int m, int n) { // 创建一个二维数组 dp 来存储到达每个位置的不同路径数量 int[][] dp = new int[m][n]; // 初始化第一行,因为从左上角只能一直向右走到达第一行的每个位置,所以路径数都为 1 for (int j = 0; j < n; j++) { dp[0][j] = 1; } // 初始化第一列,因为从左上角只能一直向下走到达第一列的每个位置,所以路径数都为 1 for (int i = 0; i < m; i++) { dp[i][0] = 1; } // 从 (1, 1) 位置开始遍历整个网格 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { // 状态转移方程:到达当前位置 (i, j) 的路径数等于到达上方位置 (i - 1, j) 的路径数加上到达左方位置 (i, j - 1) 的路径数 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } // 最终结果存储在 dp[m - 1][n - 1] 中,表示到达右下角位置的不同路径数量 return dp[m - 1][n - 1]; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 提示用户输入网格的行数 System.out.print("请输入网格的行数 m: "); int m = scanner.nextInt(); // 提示用户输入网格的列数 System.out.print("请输入网格的列数 n: "); int n = scanner.nextInt(); // 调用 uniquePaths 方法计算不同路径数量 int result = uniquePaths(m, n); // 输出结果 System.out.println("从左上角到右下角的不同路径数量为: " + result); // 关闭 Scanner 对象 scanner.close(); } }
运行截图·: