我吐槽下这题,输入输出的问题,然后时间高了四五倍.........
题意:求解无效轰炸有多少次,解释下什么叫有效轰炸,也就是在 区间内不存在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;
}
京公网安备 11010502036488号