C/C++ 动态规划入门:二维路径问题实战解析
绪论
本章聚焦二维动态规划。相比一维,状态表示从单点扩展为坐标 (x, y),管理的维度增加,但核心逻辑一致:状态定义、转移方程、初始化、遍历顺序、结果返回。
若对动规基础尚不熟悉,建议先复习一维 DP 的五步分析法。这里我们直接应用这套思维模型,通过六个经典案例深入理解二维网格中的路径问题。
路径问题实战
1. 不同路径
题目描述: 机器人位于 m x n 网格左上角,每次只能向右或向下移动,求到达右下角的不同路径数。
思路分析:
- 状态定义:
dp[i][j]表示到达位置 (i, j) 的路径总数。 - 转移方程: 只能从上方或左方过来,故
dp[i][j] = dp[i-1][j] + dp[i][j-1]。 - 初始化技巧: 为避免边界判断,通常给 DP 表多开一行一列。将
dp[0][1]设为 1,这样第一行和第一列在计算时会自动累加为 1,符合题意(边缘只有一种走法)。 - 遍历顺序: 从上到下,从左到右。
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(带障碍)
题目描述: 网格中存在障碍物,路径不能经过障碍物。
思路分析:
- 核心逻辑同上,只需增加障碍物判断。
- 遇到障碍物时,该位置路径数为 0,且不影响后续计算(因为 跳过赋值,保持默认 0)。


