蒜头君打地鼠
蒜头君打地鼠
蒜头君最近迷上了打地鼠,但他发现同时出现在面板上的地鼠太多,于是他想改进一下他的锤子,于是他拿出了一款 k \times kk×k 大小的正方形锤子,但是遗憾的是,这个锤子只能斜着砸。如下图所示:
当 k=2k=2 时,若蒜头君敲击黑点,黑点和图中所有蓝色点将一并被敲到。
当 k=3k=3 时,锤子的图案如下所示:
1
- - * - -
2
- * * * -
3
* * x * *
4
- * * * -
5
- - * - -
kk 取其他值时以此类推。
注意:蒜头君只能敲击面板上的格子,但锤子不一定要全部落在面板内。
现在给定一个 n \times nn×n 的面板,每个格子可能有地鼠也可能没有地鼠,请编程计算用 k \times kk×k 大小锤子敲击时最多能打中多少地鼠。
输入格式
第一行 22 个整数 n,kn,k,表示面板大小和锤子大小。
接下来 nn 行,每行 nn 个整数,若为 11 代表该格子有地鼠,若为 00 代表该格子无地鼠。不会出现其他的数字。
输出格式
输出一个整数,代表最多能砸到的地鼠数。
数据规模
对于 5050% 的测试数据,满足 1 \le n \le 300,1 \le k \le 101≤n≤300,1≤k≤10;
对于 8080% 的测试数据,满足 1 \le n \le 2000,1 \le k \le101≤n≤2000,1≤k≤10;
对于 100100% 的测试数据,满足 1 \le n \le 2000,1 \le k \le 1001≤n≤2000,1≤k≤100。
样例说明
敲击第 22 行的 00,可以敲到周围的 44 个地鼠。
样例输入
3 2 0 1 1 1 0 1 0 1 0
样例输出
4
题解:
暴力水分
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; typedef long long lol; lol n,m,a[2001][2001],ans,mmax; lol gi() { lol ans=0,f=1; char i=getchar(); while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();} while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();} return ans*f; } int main() { lol i,j,k; n=gi();m=gi(); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { a[i][j]=gi(); a[i][j]+=a[i][j-1]; } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { ans=0; ans+=a[i][min(n,j+m-1)]-a[i][max((lol)0,j-m)]; for(k=1;k<m;k++) { lol s=min(j+m-k-1,n),ss=max(j-m+k,(lol)0); if(i+k<=n)ans+=a[i+k][s]-a[i+k][ss]; if(i-k>=1)ans+=a[i-k][s]-a[i-k][ss]; } mmax=max(mmax,ans); } } printf("%lld",mmax); return 0; }