路径问题
本章主要讲解二维数组中的动态规划,核心步骤包括状态表示、状态方程、初始化、移动方向和返回结果。
在二维中,状态表示从一维的单个索引变为二维坐标 (i, j)。通常以左上角到达 (i, j) 位置为状态定义,但在某些题目(如地下城游戏)中,需反向思考,即以 (i, j) 出发到达终点。
1. 不同路径
题目描述: 一个机器人位于 m x n 网格的左上角。每次只能向下或者向右移动一步。问总共有多少条不同的路径?
分析:
- 状态表示:
dp[i][j]表示走到 (i, j) 位置的方法数。 - 状态转移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-1]。当前格子的方法数等于上方和左方格子之和。 - 初始化:为了处理边界,通常增加一行一列虚拟节点。将
dp[0][1]设为 1,这样第一行和第一列通过方程计算后均为 1。 - 填表顺序:从上到下,从左到右。
- 返回值:
dp[m][n]。
代码实现:
class Solution {
public:
int uniquePaths(int n, int m) {
vector<vector<int>> dp(n + 1, vector<int>(m + 1));
dp[0][1] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[n][m];
}
};
2. 不同路径 II
题目描述: 网格中包含障碍物,机器人不能进入障碍物所在格子。求路径数。
分析:
与上题类似,区别在于遇到障碍物时,该位置的 dp[i][j] 应为 0,且不影响后续计算。
代码实现:


