SJTUOJ1002. 二哥种花生(二维前缀和)

 

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 。

 

一开始没反应改过来长为l,宽为 w。。。

题意如上 求一个l * w 的矩阵中元素和的最大值

思路:O(n^{2}) 枚举矩形,然后求和的话,如果一个个相加的话肯定会超时。我们可以预处理二维前缀和,然后O(1) 求得矩阵的和。

AC Code:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
//#define read(x) scanf("%d",&x)
#define Read(x,y) scanf("%d%d",&x,&y)
#define gc(x)  scanf(" %c",&x);
#define mmt(x,y)  memset(x,y,sizeof x)
#define write(x) printf("%d\n",x)
#define pii pair
#define INF 1e13
#define ll long long
#define mod  998244353
const int N = 1e5 + 10;
const int M = 2e6 + 1005;
int a[1005][1005];
int s[1005][1005];
int main()
{
    int n,m;
    cin>>n>>m;//长度L,W 注意 n在这里相当于 长度,m 相当于宽度!
    for(int i = 1;i <= n;++i){//预处理
        for(int j = 1;j <= m;++j){
            cin>>a[i][j];
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
        }
    }
    int l,w;
    cin>>l>>w;
    int MAX = 0;
    for(int i = l ;i <= n;++i){//枚举长度为l,宽度为 w的矩形
        for(int j = w;j <= m;++j){
            MAX = max(MAX,s[i][j] - s[i - l][j] - s[i][j - w] +s[i - l][j - w]);
        }
    }

    cout<

 

你可能感兴趣的:(前缀和与差分)