问题描述
在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或者右下走。只需要求出这个最大和即可。不必给出具体路径。
三角形的行数大于1小于等于100,数字为0-99
输入格式
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
算法思想
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
右边是maxsum数组,要求其值,这个数组中每一个元素能代表其到最底边的最大和,一开始,底边的数字到底边的最大和我们就能求出来,2这个数字到底边的最大和应该是4和5这两个里面比较大的那一个加上它,也就是7,同理,7应该加上5就是12,4加上6应该是10.所以倒数第二行的最大和我们就可以算出来了,同理,往上推,可以得到第一层到底边的最大和为30,如图所示。
整个过程是从最底层最大和开始,一层一层的往上推,每次找两个就能推出上面一个,这一层推出来就能把下一层写出来
程序代码
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXSIZE 10
int n;
int d[MAXSIZE][MAXSIZE];
int maxSum[MAXSIZE][MAXSIZE]; //存储从某一点到最底边的最大路径值
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>d[i][j];
//初始化maxsum数组,当未被计算时,其值为-1
maxSum[i][j]=-1;
}
}
//已知初始条件,最后一层到底边的最大值等于自己
for(int i=1;i<=n;i++){
maxSum[n][i]=d[n][i];
}
//从最下面一层开始计算maxsum数组的值
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
//某层maxsum数组的值等于下边和右下边的maxsum值加上自己的最大值
maxSum[i][j]=max(maxSum[i+1][j],maxSum[i+1][j+1])+d[i][j];
}
}
cout<<maxSum[1][1];
return 0;
}