问题描述
(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
输入格式
文件中首先读到的是三角形的行数
接下来描述整个三角形
输出格式
最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
问题分析
这道题其实就是从已有的一系列整数数据中选取若干个整数来做加法,使得和最大。
但是也有限制条件:
1.每一层只能选择一个
2.且选择第n层的下一层时,只能选择第n层的左下方或者右下方的整数
这道题一般使用数组作为存储输入数据的数据结构
所以在实际存储(逻辑上)中,数据的位置不再像下图这样的等腰三角形(金字塔)
而是更加像是一个直角三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
所以,上面的限制实际上变成了
1.每一层只能选择一个
2.且这一层选择的数据为为Array[i][j]时,下一层只能从Array[i+1][j]和Array[i+1][j+1]中选择一个
算法分析
到目前为止,该题使用什么数据结构和题意都已经清楚。那么下一步就是设计算法
这篇文章选择自底向上的求和方法。也就是说,从第n层向第1层求和(设第一层序号为1)。图示如下:
获得结果:
重复上述步骤,即可获得最大和,且最大和存储在Array[0][0]中
C++代码
#include <iostream>
using namespace std;
int main(){
int **array,i,j,col;
cin>>col;
array = new int*[col];
for(i = 0;i < col;i++){
array[i] = new int[i+1];
for(j = 0;j <= i;j++)
cin>>array[i][j];
}
for(i = col - 2;i >= 0;i--){ //从倒数第二行开始计算
for(j = 0;j <= i;j++){
if(array[i+1][j] > array[i+1][j+1])
array[i][j] += array[i+1][j];
else
array[i][j] += array[i+1][j+1];
}
}
cout<<array[0][0];
return 0;
}