问题描述
LeetCode 62题“不同路径”是一个经典的动态规划问题。题目要求计算一个机器人在一个 m x n
的网格中,从左上角(Start)到达右下角(Finish)的不同路径数量。机器人每次只能向下或向右移动一步。
算法分析
动态规划
动态规划是解决这类问题的有效方法。我们可以定义一个 dp
数组,其中 dp[i][j]
表示到达位置 (i, j)
的不同路径数量。
状态转移方程
对于每个位置 (i, j)
,机器人可以从左边 (i, j-1)
或上面 (i-1, j)
到达。因此,状态转移方程为: dp[i][j]=dp[i−1][j]+dp[i][j−1]
初始化
-
第一行和第一列的每个位置只能从一个方向到达,因此
dp[0][j] = 1
和dp[i][0] = 1
。
代码实现
以下是使用C++实现的代码:
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n));for (int i = 0; i < m; ++i) {dp[i][0] = 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];}
};
时间复杂度
时间复杂度为 O(m×n),因为我们需要计算 dp
数组中的每个元素。
空间复杂度
空间复杂度为 O(m×n),因为我们需要存储 dp
数组。
总结
通过动态规划,我们可以有效地计算出机器人在网格中从左上角到右下角的不同路径数量。这种方法利用了状态转移方程和边界条件,避免了重复计算,提高了算法的效率。