1.5.1 Number Triangles 数字金字塔

1.5.1 Number Triangles 数字金字塔

时间: 1ms        内存:64M

描述:

考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。 每一步可以走到左下方的点也可以到达右下方的点。

        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。

输出:

单独的一行包含那个可能得到的最大的和。

示例输入:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

示例输出:

30

提示:

参考答案(内存最优[4692]):

#include<stdio.h>
#include<string.h>
int a[1005][1005];
int Max(int a,int b)
{
if(a>=b)return a;
else
return b;
}
int main()
{
    int i,j,n;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=(n-1); i>=1; i--)
    {
        for(j=1; j<=i; j++)
        {
            a[i][j]+=Max(a[i+1][j],a[i+1][j+1]);
        }
    }

    printf("%d",a[1][1]);
    return 0;

}

参考答案(时间最优[56]):

#include<stdio.h>
#include<string.h>

int max(int a,int b){
	return a>b ? a:b;
}
int num[1000][1000],f[1000];

int main(){
	int R;
	int i,j;
	scanf("%d",&R);
	for (i=0;i<R;i++)
		for(j=0;j<i+1;j++)
			scanf("%d",&num[i][j]);

	for (i=0;i<R;i++)
		f[i]=num[R-1][i];

	for (i=R-1-1;i>=0;i--)
		for (j=0;j<=i;j++)
		{
			f[j]=max(f[j],f[j+1])+num[i][j];}

printf("%d\n",f[0]);

return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞