问题描述 :
考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入说明 :
第一个行包含 R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。
输出说明 :
输出仅一行,包含那个可能得到的最大的和。
输入范例 :
6
7
3 8
8 1 0
2 7 4 100
4 5 2 6 5
3 2 5 8 7 6
输出范例 :
129
问题分析:
从上往下逐个求解,求出每个位置的最大值,例如:a[2][3]=a[2][1]+a[2][3];或者a[2][3]=a[2][3]a[1][2];直接计算到最后一行,寻找最后一行的最大值。
具体代码:
#include <iostream>
#include<iomanip>
#include <cmath>
#include<bits/stdc++.h>
#include <stack>
#include<string>
using namespace std;
int main(){
int m,n;
cin>>n;
int a[n][n]={0,0,0};
//数据输入。
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j<=i)
{
cin>>m;
a[i][j]=m;
}
//在这里需要对其他没有涉及到的a[i][j]赋值,下边要用到,
//如果没有赋值在codeblocks下会出错,有毛病。
else{
a[i][j]=0;
}
}
}
//数据处理。
for(int i=1;i<n;i++){
for(int j=0;j<=i;j++){
if(j==0){
a[i][j]=a[i][j]+a[i-1][j];
}
else if(a[i-1][j]>a[i-1][j-1])
{
a[i][j]=a[i][j]+a[i-1][j];
}
else
{
a[i][j]=a[i][j]+a[i-1][j-1];
}
}
}
int max=a[n-1][0];
for(int i=1;i<n;i++)
{
if(a[n-1][i]>max)
max=a[n-1][i];
}
cout<<max;
return 0;
}