1. 程式人生 > >SJTUOJ 1002. 二哥種花生

SJTUOJ 1002. 二哥種花生

題目內容

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