问题描述:
给定一个有n行数字组成的数字三角形,如下图所示:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
设计一个算法,计算出从三角形的顶端至底的一条路径,是该路径经过的数字总和最大。
样例最大值为:30 = 7 + 3 +8 +7 + 5;
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
int a[105][105],mp[105][105];
void init()
{
memset(a,0,sizeof(a));
memset(mp,0,sizeof(mp));
}
int find(int n)
{
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
mp[i][j]+=max(mp[i+1][j],mp[i+1][j+1]);
}
}
return mp[1][1];
}
int main()
{
int n;
while(1)
{
printf("请输入路径层数(输入“0”结束,上限100):");
scanf("%d",&n);
if(!n){printf("See You Again!\n");break;}
else if(n>100){printf("数据超限!请重新输入!\n");continue;}
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);
mp[i][j]=a[i][j];
}
int ans=find(n);
printf("%d\n",ans);
}
return 0;
}
/*
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
*/
