59 数字金字塔
作者: xxx时间限制: 1S章节: 二维数组
问题描述 :
考虑在下面被显示的数字金字塔(第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
笔记
这道题的思路其实很简单。
第二行以后,每行的第一个元素只可能与上一行的第一个元素来,其它元素只能从正上方或右上方来,即:
if(j==0) a[i][j]+=a[i-1][j];
else if(a[i-1][j]>a[i-1][j-1])
a[i][j]+=a[i-1][j];
else a[i][j]+=a[i-1][j-1];
这题考察的是二维数组,还有一个重点是:
如果数组大小较大(10^6级别)需要将其定义在主函数外面,否则程序异常退出。
函数内部申请的局部变量来自系统栈,允许申请的空间较小;函数外部的申请的全局变量来自静态存储区,允许申请的空间较大。>>参考
本题定义的数组是10^3*10^3的,所以必须定义成全局的,否则异常退出。
RE:程序运行时错误。可能的原因:1、main函数return的不是0或者忘记写return 0语句; 2、除0或指针错误等原因造成程序崩溃。
具体信息如下:
测试用例ID为2202,2203,2205,2207,2924,2925,运行时错误
运行时错误
运行时错误
运行时错误
运行时错误
运行时错误
运行时错误
代码
#include<stdio.h>
#include<string.h>
int a[1000][1000];
int main(){
int R;
scanf("%d",&R);
int i,j;
for(i=0;i<R;i++){
for(j=0;j<R;j++)
a[i][j] = 0;
}
for(i=0;i<R;i++){
for(j=0;j<=i;j++)
scanf("%d",&a[i][j]);
}
for(i=1;i<R;i++){
for(j=0;j<=i;j++){
if(j==0) a[i][j]+=a[i-1][j];
else if(a[i-1][j]>a[i-1][j-1])
a[i][j]+=a[i-1][j];
else a[i][j]+=a[i-1][j-1];
}
}
int max_s = -1;
for(i=0;i<R;i++)
if(a[R-1][i]>max_s) max_s = a[R-1][i];
printf("%d\n",max_s);
return 0;
}