就是O(n^2)也行啊!
题目:
今天是周末,蜗蜗和他的小伙伴出去捕鱼。他们来到了一个边长为 n
的正方形的鱼塘,鱼塘主给蜗蜗他们提供了一种特
殊的渔网,这种渔网一次能捕获一个边长为 m
的正方形区域内的鱼。蜗蜗比较懒,只想扔一次网,请问蜗蜗最多捕获多少条鱼?
输入格式
第一行两个整数 n
和 m
,表示鱼塘的大小和渔网能捕获的区域的大小。
接下来 n
行,第 i
行 n
个整数 bi,1,bi,2,...,bi,n
,其中 bi,j
表示鱼塘中第 i
行第 j
列位置上鱼的数量。
输出格式
一行一个整数,表示蜗蜗最多能捕获多少条鱼。
样例输入1
4 1
1 2 1 1
2 3 2 0
1 2 1 0
0 0 0 0
样例输出1
3
样例解释1
渔网一次能捕获一个长度为 1
的正方形区域内的鱼,在所有长度为 1
的正方形区域中,以 b2,2
为左上角的正方形区域中鱼的数量最多,有 3
条鱼,所以一次最多能捕获 3
条鱼。
样例输入2
4 2
1 1 0 1
2 2 0 2
3 2 0 3
2 2 2 4
样例输出2
9
样例解释2
渔网一次能捕获一个长度为 2
的正方形区域内的鱼,在所有长度为 2
的正方形区域中,以 b3,3
为左上角的正方形区域中鱼的数量最多,有 9
条鱼,所以一次最多能捕获 9
条鱼。(显然以 b3,1
为左上角的正方形区域中鱼的数量也是 9
条,捕鱼的正方形区域是不唯一的)
数据范围
保证 1≤m≤n≤500,1≤n∗m≤5000,0≤bi,j≤106。
rt,我的代码是O(n^4)(暴力枚举)
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long minid;
int a[501][501];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
long long sum;
for(int i=1;i+m-1<=n;i++){
for(int j=1;j+m-1<=n;j++){
sum=0LL;
for(int l=i;l<=i+m-1;l++){
for(int k=j;k<=j+m-1;k++){
sum+=a[l][k];
}
}
minid=max(minid,sum);
}
}
printf("%lld",minid);
return 0;
}
但是有没有什么优化方法(目前已知的是二维前缀和,但是用不来,所以来看一看有没有什么边边角角的优化)