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

你可能感兴趣的:(SJTUOJ)