题目描述
有一个由数字组成的三角形数塔,站在上一层的某个点,只能到达其下方左右的两个点。现在请找到一条从上到下的路径,使得路径上所有数字相加之和最大

数字三角形_i++

输入
第一行输入一个数字 n(1≤n≤1000)代表数塔层数

接下来n行,按数塔图形,每行有一个或多个的整数,表示该层节点的值(节点值≤100000)
输出
输出一个整数,代表从上到下路径上所有数字相加和的最大值。

例输入1

6
3
9 5
4 2 1
3 4 9 6
3 5 3 7 3
2 1 3 9 3 2

样例输出1

39
#include<iostream>
#include <cstdio>
using namespace std;

int n, num[1005][1005];

int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
scanf("%d", &num[i][j]);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
num[i][j] += max(num[i - 1][j - 1], num[i - 1][j]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, num[n][i]);
}
printf("%d\n", ans);
return 0;
}

方法二:从下往上

#include<iostream>
using namespace std;

int n, num[1005][1005];

int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
scanf("%d", &num[i][j]);
}
}
for (int i = n; i > 0; i--) {
for (int j = 1; j <= i; j++) {
num[i][j] += max(num[i + 1][j], num[i + 1][j + 1]);
}
printf("%d\n", num[1][1]);
}
return 0;
}