问题:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为 0 - 99
输入格式:
5 //三角形行数,下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
要求输出最大和
思路:
1. 直接输入行数,利用双重循环输入;
2. 记maxSum为-1,执行函数MaxSum(1,1);
3. 如果maxSum不为-1,返回maxSum;
4. 如果行遍历完,将maxSum赋值D;反之,将x记为左下角值,将y记为右下角值,maxSum赋值为x/y中的最大值+本行的值;
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX]; //储存数组
int n; //行数
int maxSum[MAX][MAX]; //最大和数组
int MaxSum(int i,int j) //求最大和的函数
{
if(maxSum[i][j]!=-1) //如果maxSum不为-1,则表示已经执行完毕,返回maxSum结束运行
return maxSum[i][j];
if(i==n) //如果遍历完毕,则令maxSum为D
maxSum[i][j]=D[i][j];
else
{
int x=MaxSum(i+1,j); //记x为左下角和
int y=MaxSum(i+1,j+1); //记y为右下角和
maxSum[i][j]=max(x,y)+D[i][j]; //maxSum为下一行的最大值加本行值
}
return maxSum[i][j];
}
int main()
{
int i,j;
cin>>n; //输入行数
for(i=1;i<=n;i++) //利用二重循环,输入数组,记maxSum为-1
for(j=1;j<=i;j++)
{
cin>>D[i][j];
maxSum[i][j]=-1;
}
cout<<MaxSum(1,1)<<endl; //输出MaxSum(1,1)
}