二维前缀和:轰炸区最优选取

【算法分析】
本题用到了二维前缀和的知识点。
灵活运用二维前缀和,能够大大降低算法的时间复杂度。
二维前缀和的计算公式为:S(x2,y2)+S(x1-1,y1-1)-S(x2,y1-1)-S(x1-1,y2)
示意图如下所示。其中绿色区域是保留区域,红色双箭头经过的区域为删除区域

为了方便记忆,给出二维前缀和的计算公式的助记示意图。如下所示。

二维前缀和的知识点详见:https://blog.csdn.net/hnjzsyjyj/article/details/120265452

 
【问题描述】
现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。
我们现在有一次轰炸敌人的机会,轰炸敌人的区域是一个k*k的正方形区域,现在需要你解决的问题就是计算最多轰炸的敌人数量是多少?

【输入格式】
本题包含多组数据,每组数据第一行输入两个数n,k。接下来n行,每行n个数字,表示这个点上的敌人数量。
数据范围:1<=n<=50,1<=k<=n
每个点上的敌人数量不超过100个(0<=a[i][j]<=100)。

【输出格式】
每组数据输出包含一行,表示计算的结果。

【输入输出样例】
in1:
4 2
1 1 0 0
1 1 0 0
0 0 2 2
0 0 2 2

out1:
8
---------------------------------------
in2:
5 3
1 2 5 7 5
7 0 6 5 8
0 0 3 2 9
4 1 7 9 0
0 0 9 1 2

out2:
50

【程序代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=110;
int a[maxn][maxn];
int s[maxn][maxn];

int main() {
    int n, k;
    while(cin>>n>>k) {
        for(int i=1; i<=n; ++i) {
            for(int j=1; j<=n; ++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 ans=0;
        for(int i=k; i<=n; ++i) {
            for(int j=k; j<=n; ++j) {
                int sum=s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k];
                ans=max(ans,sum);
            }
        }

        cout<<ans<<endl;
    }

    return 0;
}



/*
in1:
4 2
1 1 0 0
1 1 0 0
0 0 2 2
0 0 2 2

out1:
8

-----------------

in2:
5 3
1 2 5 7 5
7 0 6 5 8
0 0 3 2 9
4 1 7 9 0
0 0 9 1 2

out2:
50
*/


【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/120265452
https://blog.csdn.net/wangqianqianya/article/details/91127614
https://blog.csdn.net/qq_41117236/article/details/89438153
https://blog.csdn.net/K_R_forever/article/details/81775899
https://blog.csdn.net/Wchenchen0/article/details/82925905
https://blog.csdn.net/johnwayne0317/article/details/84928568
https://gwx123456.blog.luogu.org/ci-fen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值