HNOI2003 激光炸弹 - 矩阵前缀和

作为蒟蒻还是要写一下这个“边界上的不会被摧毁”的做法

在输入时直接把坐标往右上移动1个 x+1, y+1
然后按r找正方形,注意枚举到5001

因为我再按原来的方式枚举正方形的时候,那些现在,位于正方形右边和上边两条边上的点,其实都在里面,那些位于下边和左边的,我在处理矩阵前缀和的时候已经删去了,因为我是g[i][j] - g[i-r][j] - g[i][j-r] + g[i-r][j-r]
i-r,正好到正方形下边界,然后我减掉了这条边上的所有点,这样在原本在边界上的点就没有被统计到答案中

另外, 开两个5000X5000的数组会爆内存

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 5010;
int g[MAXN][MAXN],ans,sum[MAXN][MAXN],n,r;
int main() {
    cin >> n >> r;
    for(int i=1; i<=n; i++) {
        int x, y;
        cin >> x >> y;
        cin >> g[x+1][y+1];
    }
    for(int i=1; i<=5001; i++) { 
        for(int j=1; j<=5001; j++) {
            g[i][j] = g[i][j] + g[i-1][j] + g[i][j-1] - g[i-1][j-1];
        }
    }
    for(int i=r; i<=5001; i++) {
        for(int j=r; j<=5001; j++) {
            ans = max(ans, g[i][j] - g[i-r][j] - g[i][j-r] + g[i-r][j-r]);
        }
    }
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/fantasy_world/article/details/81156114
今日推荐