思路:使用动态规划自底向上运算
状态转换方程:f[i][j] = max{ f[i+1][j], f[i+1][j+1] } + a[i][j]
如果题目数据中金字塔的行数太多,可以使用register,提高读写速度,也就是代码里注释掉的部分
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
30
以下是C代码
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
//#include <bits/stdc++.h>
//#define fp(i,l,r) for(register int i=(l);i<=(r);i++)
//#define fd(i,r,l) for(register int i=(r);i>=(l);i--)
//using namespace std;
int a[1000][1000], f[1000][1000];
int _max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n;
scanf("%d", &n);
/*fp(i, 1, n) {
fp(j, 1, i) {
scanf("%d", &a[i][j]);
f[i][j] = a[i][j];
}
}*/
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
scanf("%d", &a[i][j]);
f[i][j] = a[i][j];
}
}
/* fd(i, n - 1, 1) {
fp(j, 1, i) {
f[i][j] = _max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
}
}*/
for (int i = n - 1; i >= 1; i--)//自底向上
{
for (int j = 1; j <= i; j++)//自左向右
{
f[i][j] = _max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
}
}
printf("%d", f[1][1]);
return 0;
}