激光炸弹

[HNOI2003]激光炸弹

https://ac.nowcoder.com/acm/problem/20032

思路
首先题目让我们求最多能炸掉多少的目标,我们可以用F[i][j]来代表(Xi,Yi)的值,而且题目让我们求以r为边长的正方形覆盖的最大权值,很明显可以想到二维的前缀和

为什么用二维前缀和 :
就是预处理的思想,在O(1)的时间内求出二维数组中的某个矩阵的区域内的数字之和

公式
F[i][j] = F[i][j-1]+F[i-1][j]+a[i][j]-F[i-1][j-1],不过可以通过求自身的前缀和来稍稍优化下内存= =;

图片说明

附蒟蒻的代码

#include <bits/stdc++.h>

using namespace std;
const int N = 5010;

int g[N][N];
int n,r;
int main ()
{
    int x,y,v;
    scanf("%d%d",&n,&r);

    int a = r,b = r;
    for (int i = 1 ; i <= n ; i++)
    {
        cin>>x>>y>>v;
        x++,y++;
        a = max(a,x),b = max(b,y);
        g[x][y]+=v;
    }

    for (int i = 1 ; i <= a ; i++)
    {
        for (int j = 1 ; j <= b ; j++)
        g[i][j]+=g[i-1][j]+g[i][j-1]-g[i-1][j-1];
    }

    int res = 0;
    for (int i = r ; i <= a ; i++)
    {
        for (int j = r ; j <= b ; j++)
        res = max(res,g[i][j]-g[i-r][j]-g[i][j-r]+g[i-r][j-r]);
    }

    cout<<res<<endl;
    return 0;
}
全部评论

相关推荐

仁者伍敌:服务员还要脱颖而出,这是五星级酒店吗
点赞 评论 收藏
分享
迟缓的斜杠青年巴比Q...:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务