SJTUOJ 1002. 二哥種花生
阿新 • • 發佈:2018-12-16
題目內容
Description
二哥在自己的後花園裡種了一些花生,也快到了收穫的時候了。這片花生地是一個長度為L、寬度為W的矩形,每個單位面積上花生產量都是獨立的。他想知道,對於某個指定的區域大小,在這麼大的矩形區域內,花生的產量最大會是多少。
Input Format
第1行有2個整數,長度L和寬度W。
第2行至第L+1行,每行有W個整數,分別表示對應的單位面積上的花生產量A( 0≤A<100≤A<10 )。
第L+2行有2個整數,分別是指定的區域大小的長度a和寬度b。
Output Format
輸出一個整數m,表示在指定大小的區域內,花生最大產量為m。
Sample Input
4 5
1 2 3 4 5
6 7 8 0 0
0 9 2 2 3
3 0 0 0 1
3 3
Sample Output
38
樣例解釋
左上角:38 = (1+2+3) + (6+7+8) + (0+9+2)
資料範圍
對於30%的資料: 1≤L,W≤1001≤L,W≤100;
對於100%的資料: 1≤L,W≤10001≤L,W≤1000。
全部區域大小滿足:1≤a≤L,1≤b≤W1≤a≤L,1≤b≤W 。
程式碼實現及分析
很標準的字首和問題
輸入的時候計算字首和並儲存,
s[i][j]:
s[i-1][j-1] | s[i-1][j] | ||
s[i][j-1] |
input |
示意圖如上,s[i][j] = input + s[i-1][j] + s[i][j-1] - s[i-1][j-1];
輸入a,b之後可求得sum = s[i + a][j + b] - s[i][j+b] - s[i+a][j] + s[i][j];
#include <stdio.h>
int s[1001][1001]={0};
int main()
{
int l, w,i,j,a,b,input,max,sum;
while(scanf("%d %d",&l,&w)!=EOF)
{
for (i = 0; i <= l; i++)
{
for (j = 0; j <= w; j++)
{
if(i == 0 || j == 0)
{
s[i][j]=0;
continue;
}
scanf("%d", &input);
s[i][j] = input + (i>0 ? s[i-1][j]:0) + (j>0?s[i][j - 1]:0) - ((i>0&&j>0) ? s[i-1][j-1]:0);
}
}
scanf("%d %d", &a, &b);
max = 0;
for (i = 0; i < l - a+1; i++)
{
for (j = 0; j < w - b+1; j++)
{
sum = s[i + a][j + b] - s[i][j+b] - s[i+a][j] + s[i][j];
if(max < sum)
{
max = sum;
}
}
}
printf("%d\n", max);
}
return 0;
}
時間:1434ms 空間:20944kb