C/C++ 动态规划入门:二维路径问题实战解析
前言
本章聚焦于二维动态规划中的路径类问题。相比一维 DP,二维状态表示从单点扩展到了坐标 (x, y),管理的维度增加了一个。如果你还没接触过动态规划的基础概念,建议先复习一下五步分析法(状态定义、转移方程、初始化、遍历顺序、返回值),这里我们直接应用。
二维 DP 的核心在于理解状态的含义以及如何在网格中推导最优解。下面通过六道经典题目,带你从基础到进阶,彻底吃透这类问题。
1. 不同路径
题目描述
一个机器人位于一个 m x n 网格的左上角,每次只能向下或者向右移动一步。问总共有多少条不同的路径到达右下角?
思路分析
这是一个典型的计数型 DP 问题。
- 状态定义:
dp[i][j]表示从起点到达位置(i, j)的路径总数。 - 转移方程:到达
(i, j)只能从上方(i-1, j)或左方(i, j-1)过来,所以dp[i][j] = dp[i-1][j] + dp[i][j-1]。 - 初始化:为了简化边界判断,通常给 DP 表多开一行和一列。将
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));
// 初始化虚拟节点,让第一行和第一列自动变为 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 - ];
}
}
dp[n][m];
}
};


