优化时间复杂度,O(n^4),惨不忍睹啊!
  • 板块学术版
  • 楼主difficultlong
  • 当前回复20
  • 已保存回复20
  • 发布时间2024/10/5 07:16
  • 上次更新2024/10/5 10:28:06
查看原帖
优化时间复杂度,O(n^4),惨不忍睹啊!
1435692
difficultlong楼主2024/10/5 07:16

就是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;
}

但是有没有什么优化方法(目前已知的是二维前缀和,但是用不来,所以来看一看有没有什么边边角角的优化)

2024/10/5 07:16
加载中...