题目描述
设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示:
若要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。
输入
第一行为n(n<10),表示数塔的层数
从第2行至n+1行,每行有若干个数据,表示数塔中的数值。
输出
输出路径和最大的路径值。
样例输入 Copy
5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
样例输出 Copy
86
#include <stdio.h>
#define MAX_N 10
// 计算数塔最大路径和的函数
int max_path_sum(int triangle[MAX_N][MAX_N], int n) {
// 从倒数第二层开始向上更新路径和
for (int i = n - 2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
// 对于每个节点,选择从它开始向下走到底的路径中路径和最大的一条,并加上当前节点的值
triangle[i][j] += triangle[i + 1][j] > triangle[i + 1][j + 1] ? triangle[i + 1][j] : triangle[i + 1][j + 1];
}
}
// 最终结果保存在数塔的顶端节点
return triangle[0][0];
}
int main() {
int n;
printf("请输入数塔的层数:");
scanf("%d", &n);
// 读取数塔数据
int triangle[MAX_N][MAX_N];
printf("请输入数塔的数据:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &triangle[i][j]);
}
}
// 调用函数求解最大路径和
int max_sum = max_path_sum(triangle, n);
// 输出结果
printf("路径和最大值为:%d\n", max_sum);
return 0;
}