#include <stdio.h>
#include <stdlib.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int largestSum(int triangle[][100], int N) {
int dp[100][100] = {0};
dp[0][0] = triangle[0][0];
for (int i = 1; i < N; i++) {
for (int j = 0; j <= i; j++) {
if (j - 1 >= 0 && j + 1 < N) {
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]);
dp[i][j] = max(dp[i][j], dp[i-1][j+1]);
} else if (j - 1 >= 0) {
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]);
} else if (j + 1 < N) {
dp[i][j] = max(dp[i-1][j], dp[i-1][j+1]);
}
dp[i][j] += triangle[i][j];
}
}
int largest = 0;
for (int i = 0; i < N; i++) {
if (dp[N-1][i] > largest) {
largest = dp[N-1][i];
}
}
return largest;
}
int main() {
int N;
scanf("%d", &N);
int triangle[100][100];
for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &triangle[i][j]);
}
}
int answer = largestSum(triangle, N);
printf("%d\n", answer);
return 0;
}
这个想法是从三角形的顶部开始,迭代计算三角形中每个位置的最大总和,逐行向下移动。我们将使用上一行中的值来计算当前行。
算法如下:
1. 从输入中读取“N”的值,表示三角形中的行数。
2. 创建一个大小为“(N, N)”的二维数组“三角形”来存储输入数字三角形。
3. 初始化“dp”数组,所有元素都设置为 0。
4. 将“dp[0][0]”设置为三角形的第一个元素,因为它是起点。
5. 从 1 到“N-1”(含)遍历每一行“i”:
- 对于当前行中的每一列“j”,计算“dp[i][j]”作为以下三个值的最大值:
- 'dp[i-1][j-1] + triangle[i][j]' if 'j-1 >= 0' (有效的左移)
- 'dp[i-1][j] + 三角形[i][j]'
- 'dp[i-1][j+1] + triangle[i][j]' if 'j+1 < N'(有效右移)
6. 找到“dp”数组最后一行的最大值,它表示三角形从顶部到底部的最大数字总和。
7. 输出最大值作为答案。