2919: 【例67.3】 数字金字塔
内存限制:64 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:14
解决:11
题目描述
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点:
$1≤x≤20,1≤y≤20,x< z≤50$。
13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
$1≤x≤20,1≤y≤20,x< z≤50$。
输入
第一个行包含$R$($1≤R ≤1000$),表示行的数目。后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于$100$。
所有的被供应的整数是非负的且不大于$100$。
输出
单独的一行,包含那个可能得到的最大的和。
样例输入 复制
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
样例输出 复制
86
提示
【分析】从递推的思想出发,当从顶层沿着某条路径从第i层向第i+1层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方向前进,为此,我们可以采用逆推的方法,让a[i][j]存放从i,j出发到达第n层的最大值,则a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]),依次类推,a[1][1]中即为所求的最大总和。
#include<iostream>
using namespace std;
int main() {
int n, i, j, a[1001][1001];
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
cin >> a[i][j];
for (i = n - 1; i >= 1; i--)
for (j = 1; j <= i; j++)
a[i][j] = max(a[i][j] + a[i + 1][j], a[i][j] + a[i + 1] + a[j + 1]);
cout << a[1][1];
return 0;
}
#include<iostream>
using namespace std;
int main() {
int n, i, j, a[1001][1001];
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
cin >> a[i][j];
for (i = n - 1; i >= 1; i--)
for (j = 1; j <= i; j++)
if (a[i + 1][j] >= a[i + 1][j + 1])
a[i][j] += a[i + 1][j];
else a[i][j] += a[i + 1][j + 1];
cout << a[1][1];
return 0;
}