作者:45仰望易_332 | 来源:互联网 | 2024-12-20 14:47
本文讨论了机器人在一个 m x n 网格中从左上角(标记为“Start”)到右下角(标记为“Finish”)的不同路径问题。机器人每次移动只能选择向右或向下,目标是计算出所有可能的路径总数。
例如:
输入: m = 3, n = 2 输出: 3 解释: 从起点开始,有3种不同的路径可以到达终点。 1. 右 -> 右 -> 下 2. 右 -> 下 -> 右 3. 下 -> 右 -> 右
另一个例子:
输入: m = 7, n = 3 输出: 28
首先,我们可以通过递归的方法来解决这个问题。递归的基本思路是,设F(m, n)表示到达坐标(m, n)的路径数,则F(m, n) = F(m-1, n) + F(m, n-1)。当m=1且n=1时,即处于起点位置,返回1;当m=1时,无论n为何值,F(1, n) = F(1, n-1);同样,当n=1时,无论m为何值,F(m, 1) = F(m-1, 1)。
以下是递归实现的代码:
public static int rec_uniquePaths(int m, int n) { if (m == 1 && n == 1) return 1; if (m == 1) return rec_uniquePaths(m, n - 1); if (n == 1) return rec_uniquePaths(m - 1, n); return rec_uniquePaths(m-1, n) + rec_uniquePaths(m, n - 1); }
然而,递归方法在处理大数据时会遇到性能瓶颈,因为存在大量的重复计算,可能导致程序运行缓慢甚至崩溃。因此,在实际应用中通常不推荐使用递归方法。
接下来,我们介绍一种更高效的方法——动态规划。通过定义一个二维数组dp,其中dp[i][j]表示到达坐标(i, j)的路径数。根据题目要求,初始化dp[0][0] = 1,并设定边界条件,即当i或j等于0时,dp[i][0]和dp[0][j]均等于1。对于其他位置,dp[i][j] = dp[i-1][j] + dp[i][j-1]。最后,返回dp[m-1][n-1]即可得到答案。
下面是动态规划方法的具体实现:
public static long dp_uniquePaths(int m, int n) { if (m == 1 || n == 1) return 1; long[][] dp = new long[m][n]; dp[0][0] = 1; for (int i = 1; i