【正经题解】Gold King打鼠
2024-02-22 11:33:30
发布于:浙江
14阅读
0回复
0点赞
这是一个经典的动态规划问题,通常使用自底向上的方法进行求解。以下是整体的思路:
. 从输入中读取金字塔的层数 。
. 创建一个二维数组 用于存储金字塔的每个结点的值。
. 从金字塔底部往上遍历,对于每个结点,计算其子结点(下一层相邻的两个结点)的最大值,并将该值更新到当前结点。
. 不断向上遍历,直到达到金字塔的顶部,此时 [ ][ ]存储的就是金字塔的最大和。
. 输出 [ ][ ]。
这个算法的关键点在于从底部开始动态规划,每个结点的值更新为其子结点的最大值,最终得到金字塔的最大和。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 1001;
int a[MAX_N][MAX_N] = {0};
int main() {
int n;
cin >> n;
// 输入数据
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
cin >> a[i][j];
}
}
// 从倒数第二层开始,动态规划计算最大和
for (int i = n - 2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]);
}
}
// 输出结果
cout << a[0][0] << endl;
return 0;
}
这里空空如也
有帮助,赞一个