一个机器人位于一个
网格的左上角(起始点)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(终点)。问总共有多少条不同的路径?

一个机器人位于一个
网格的左上角(起始点)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(终点)。问总共有多少条不同的路径?
表示到达位置
的不同路径数, 则:
, 因为只有一种方式到达这些位置。
的二维数组
。
。
数组, 使用递推公式:
。
。
代替二维数组。
。
数组, 每次更新时, 当前值等于其自身(上一行的值)加上前一个元素(左边的值)。
。
步, 其中
步向下,
步向右。
步中选择
步向下(或选择
步向右)的方案数。
或
。
以上就是不同路径问题的基本思路。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# 初始化一个一维DP数组,初始值都为1
dp = [1] * n
# 从第二行开始逐行更新DP数组
for i in range(1, m):
for j in range(1, n):
# 当前位置的路径数等于其上方和左方的路径数之和
dp[j] += dp[j-1]
# 返回右下角位置的路径数
return dp[-1]
def uniquePathsMath(self, m: int, n: int) -> int:
# 总步数
N = m + n - 2
# 向下的步数
k = min(m - 1, n - 1)
# 计算组合数 C(N, k)
res = 1
for i in range(1, k + 1):
res = res * (N - k + i) // i
return res这段代码定义了一个名为 Solution 的类,其中包含两个方法 uniquePaths 和 uniquePathsMath,用于计算从网格的左上角到右下角的不同路径数量。
,长度为
,所有元素初始值为
。这表示在第—行的每个位置都有
条路径。
,其路径数等于上方位置
和左方位置
的路径数之和。
。
,等于
,表示从起点到终点需要的总步数。
,取
和
中的较小值。
步中选择
步向下的方式数,返回结果
.
这两个方法分别使用动态规划和数学组合的方式来解决相同的问题。
class Solution {
public:
int uniquePaths(int m, int n) {
// 初始化一个一维DP数组,初始值都为1
vector<int> dp(n, 1);
// 从第二行开始逐行更新DP数组
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
// 当前位置的路径数等于其上方和左方的路径数之和
dp[j] += dp[j-1];
}
}
// 返回右下角位置的路径数
return dp.back();
}
int uniquePathsMath(int m, int n) {
// 总步数
long long N = m + n - 2;
// 向下的步数
int k = min(m - 1, n - 1);
// 计算组合数 C(N, k)
long long res = 1;
for (int i = 1; i <= k; i++) {
res = res * (N - k + i) / i;
}
return (int)res;
}
};这段代码定义了一个名为 Solution 的类,其中包含两个方法 uniquePaths 和 uniquePathsMath,用于计算从网格的左上角到右下角的不同路径数量。
,长度为
,所有元表初始值为 1 ,表示在第一行的每个位置都有 1 条路径。
),其路径数等于上方位置(i-1, j)和左方位置(
)的路径数之和。
,等于
,表示从起点到终点需要的总步数。
,取
和
中的较小值。
步中选择
步向下的方式数,返回结果 res,并将其转换为整数类型。
这两个方法分别使用动态规划和数学组合的方式来解决相同的问题。