决定从头重新系统的学一下DP,夯实基础,嗯,从简单开始。
【题目描述】
有一数字三角形,从顶部出发,在每一结点可以选择向左走或者向右走,一直走到底层。 要求找出一条路径,使路径上的值的和最大。
【题目链接】
【解题思路】
用二维数组储存数字,记为a。 动态规划,设fi,j表示以(i,j)为起点所能获得的最大数字和。 转移: fi,j=max(fi+1,j,fi+1,j+1)+ai,j 边界: fn−1,i=an−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;
}
就这样啦