题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从 7→3→8→7→57→3→8→7→5 的路径产生了最大权值。
输入格式
第一个行一个正整数 r ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
输出格式
单独的一行,包含那个可能得到的最大的和。
输入输出样例
输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
输出
30
代码:
#include<stdio.h>
int a[1001][1001]={0},r;
main()
{
int i,j;
scanf("%d",&r);
for(i=1;i<=r;i++)
{
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
}
for(i=2;i<=r;i++)
{
for(j=1;j<=i;j++)
if(a[i][j]+a[i-1][j]>a[i][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];
}
for(i=1;i<r;i++)//最后一行最大值就是某个路径可以得到的最大权值
{
if(a[r][i]>a[r][i+1])a[r][i+1]=a[r][i];
}
printf("%d",a[r][r]);
}
代码分析:当前的值相加与前一行的对应位置的数值相加或与前一行的对应位置前一个相加比较保留最大的值,在最后一行找出的最大值就是得到的最大权值。
最近好多事哦好多好多想回家