二维前缀和.(打砖块(brick))

题目描述

KXT 是一个很无聊的小朋友,一天到晚都在打坐......

一天,被他发现了一个比打坐更无聊的事情——打砖块。很多块砖分布在一个m∗mm∗m 的矩阵中,他可以消掉以他为左上角顶点的一个 n∗nn∗n 的矩阵里的所有砖块。

喜欢偷懒的他请来了你帮他计算可以消掉最多的砖块数(只能消一次)。

输入格式

第一行:用空格隔开的三个整数 nn、mm、kk。

接下来 kk 行,每行 22 个用空格隔开的整数 xixi​、yiyi​,表示第 ii 块砖在 xixi​ 行、yiyi​ 列的位置。

数据范围

n≤mn≤m; k≤m∗mk≤m∗m

60% 的数据:n≤70n≤70; m≤70m≤70; k≤4900k≤4900

100% 的数据:n≤1000n≤1000; m≤1000m≤1000; k≤1000000k≤1000000;

输出格式

一个整数,为可以消掉最多的砖块数。

样例

输入数据 1

5 10 11
2 1
4 6
4 9
3 9
9 7
9 9
7 9
8 10
8 8
8 6
10 2

Copy

输出数据 1

6

Copy

样例解释

站在第 4 行、 6 列的位置,可以消除 6 个方块。

直接上代码:

#include<bits/stdc++.h>
using namespace std;
int s[1001][1001],n,m,k,ma;
int main(){
	cin>>n>>m>>k;
    while(k--){
        int x,y;
        scanf("%d%d",&x,&y);
        s[x][y]=1;
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
        }
    }
    for(int i=n;i<=m;i++){
        for(int j=n;j<=m;j++){
            int x=i-n+1,y=j-n+1;
            int x2=i,y2=j;
            ma=max(s[x2][y2]-s[x-1][y2]-s[x2][y-1]+s[x-1][y-1],ma);
        }
    }cout<<ma;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值