ZR#712

消灭砖块

题意:

很多块砖分布在一个 $ m \times m $ 的矩阵中,他可以消掉以他为左上角顶点的一个 $ n \times n $ 的矩阵里的所有砖块。计算可以消掉最多的砖块数(只能消一次)。

解法:

和最大子矩阵类似,不过要稍微改变一下条件和状态。
求前缀和,固定的子矩阵边长,然后把循环和计算那里容斥一下。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define LL long long
#define N 1010

int m,n,k,f[N][N],pre[N][N];

int main() {
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1 ; i <= k ; i++) {
        int x,y;
        scanf("%d%d",&x,&y);
        f[x][y]++;
    }
    for(int i = 1 ; i <= m ; i++) {
        for(int j = 1 ; j <= m ; j++) {
            pre[i][j] = f[i][j] + pre[i - 1][j];
        }
    }
    int ans = 0;
    for(int i = 1 ; i <= m - n + 1 ; i++) {
        for(int j = 1 ; j <= m - n + 1 ; j++) {
            int sum = 0;
            for(int k = j ; k <= j + n - 1 ; k++) {
                sum += pre[i + n - 1][k] - pre[i - 1][k];
                ans = max(ans,sum);
            }
        }
    }
    printf("%d \n",ans);
    //system("pause");
    return 0;
}
posted @ 2019-08-21 20:34  西窗夜雨  阅读(77)  评论(0编辑  收藏  举报