决定从头重新系统的学一下DP,夯实基础,嗯,从简单开始。
【题目描述】
有一数字三角形,从顶部出发,在每一结点可以选择向左走或者向右走,一直走到底层。 要求找出一条路径,使路径上的值的和最大。
【题目链接】
【解题思路】
用二维数组储存数字,记为$a$。 动态规划,设$f_{i, j}$表示以$(i, j)$为起点所能获得的最大数字和。 转移: $$ f_{i, j} = max(f_{i + 1, j}, f_{i + 1, j + 1}) + a_{i, j} $$ 边界: $$ f_{n - 1, i} = a_{n - 1, i} $$ 计算顺序: 因为计算第$i$行时需要下一行i + 1的信息,故应倒序枚举行。
【AC代码】
#include <cstdio>
#include <algorithm>
#define MAXM 100
#define MAXN 100
int a[MAXM][MAXN];
int f[MAXM][MAXN];
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
for(int j = 0; j <= i; j++){
scanf("%d", a[i] + j);
}
}
for(int i = 0; i < n; i++) f[n - 1][i] = a[n - 1][i];
for(int i = n - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
f[i][j] = std::max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
}
}
printf("%d\n", f[0][0]);
return 0;
}
就这样啦