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;
}