我吐槽下这题,输入输出的问题,然后时间高了四五倍.........
题意:求解无效轰炸有多少次,解释下什么叫有效轰炸,也就是在图片说明 区间内不存在1,就是有效轰炸
题解:二维前缀和模板题(算是dp吧)
如果对于每一位枚举,时间复杂度:图片说明(看题解他们有人说能过去,额,不知道咋说)
现在我们优化这个
参考链接:https://www.cnblogs.com/hulean/p/10824752.html
先计算(1,1)到(i,j)这个大的矩形之内存在的1的数量
套用下大佬的图
图片说明
计算方法,图片说明 因为对于(i-1,j)和(i,j-1)都有(i-1,j-1)这部分的面积,所以可以这两部分相加减去(i-1,j-1)
然后下来求答案
那还是按照这个图来看把(i-1,j-1)(i-1,j)(i,j-1)其中的1换成k,就能得到(i-k,j-k)到(i,j)其中的1的个数
简单说下为啥这样做:我们相当于枚举每个图片说明矩形的右下坐标,然后来判断这个矩形是否成立,因为这两个条件完全可以确定一个矩阵
时间复杂度:图片说明

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[1001][1001],s[1001][1001],ans;
signed main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%1d",&a[j][i]);
            s[j][i]=s[j-1][i]+s[j][i-1]-s[j-1][i-1]+a[j][i];
        }
    }
    for(int i=k;i<=n;i++)    for(int j=k;j<=m;j++){
        if(s[j][i]-s[j-k][i]-s[j][i-k]+s[j-k][i-k]>0)    ans++;
    }
    cout<<ans<<endl;
    return 0;
}