文章目录
0. 前言
1. 数字三角形+模板题
这个是很经典的 dp
问题,求解二维下的最大路径和。
重点: 线性 dp
、数字三角形模型
思路:
-
状态定义:
f[i][j]
表示从起点[1,1]
走到[i,j]
点的所有路径和的最大值
-
状态转移:
- 来自左上方:
f[i-1][j] + a[i][j]
- 来自右上方:
f[i][j-1] + a[i][j]
- 则状态转移方程为:
f[i][j] = max(f[i-1][j], f[i][j-1]) + a[i][j]
- 来自左上方:
-
边界情况及初始化:
- 二维下标从
[1,1]
开始,从小到大枚举行列下标即可。全局数组自动初始化为 0 - 答案即为:
f[n][m]
- 二维下标从
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 105;
int t;
int r, c;
int a[N][N];
int f[N][N];
int main() {
cin >> t;
while (t --) {
cin >> r >> c;
for (int i = 1; i <= r; ++i)
for (int j = 1; j <= c; ++j)
cin >> a[i][j];
for (int i = 1; i <= r; ++i)
for (int j = 1; j <= c; ++j)
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + a[i][j];
cout << f[r][c] << endl;
}
return 0;
}