路径类 DP 是线性 DP 的一种变体,通常在一个 n × m 的矩阵中设定行走规则,研究从起点到终点的方案数、最小路径和或最大路径和等问题。入门阶段的《数字三角形》其实也属于这一范畴。下面我们通过三道经典例题来梳理核心逻辑。
矩阵的最小路径和
给定一个 n×m 的矩阵,求从左上角走到右下角的最小路径和。
思路分析
- 状态表示:dp[i][j] 表示从 [1, 1] 走到 [i, j] 的最小路径和。
- 状态转移:最后一步只能从上方或左方过来。所以 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + a[i][j]。
- 初始化:第一行和第一列需要特殊处理。为了简化边界判断,可以将第 0 行和第 0 列初始化为无穷大,这样在取最小值时不会选中它们。起始点 dp[1][1] 直接赋值为 a[1][1]。
- 填表顺序:从上往下,从左往右。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 510;
int n, m;
int a[N][N], dp[N][N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
memset(dp, 0x3f3f3f3f, sizeof(dp));
dp[1][1] = a[1][1];
for (int i = 1; i <= n; i++) {
for ( j = ; j <= m; j++) {
(i == && j == ) ;
dp[i][j] = (dp[i - ][j], dp[i][j - ]) + a[i][j];
}
}
cout << dp[n][m] << endl;
;
}




