题目描述
读入一个N行M列的二维数组,然后有求一个边长是L的子“正方形”,要求里面的数字和最大,输出这个最大值。
输入格式
第一行3个正整数:N、M、L,范围都在[1,2000]。L<=N, L<=N
下面N行,每行M个范围在[-1000,1000]的整数。
提示:数据比较多,建议使用scanf读入。
输出格式
1个整数,表示最大值。
输入/输出例子1
输入:
3 5 3
-8 -2 -3 4 -5
4 5 -1 7 6
-1 8 9 0 -2
输出:
27
#include<bits/stdc++.h>
using namespace std;
const int M=2005;
const int N=2005;
int a[N][M];
long long sum[N][M];
int m,n,l;
long long ans=-1e12;
int main()
{
scanf("%d%d%d",&n,&m,&l);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]+a[i][j]-sum[i-1][j-1];
for(int i=1;i<=n-l+1;i++)
{
for(int j=1;j<=m-l+1;j++)
{
long long h=sum[i+l-1][j+l-1]-sum[i+l-1][j-1]-sum[i-1][j+l-1]+sum[i-1][j-1];
ans=max(ans,h);
}
}
printf("%lld",ans);
return 0;
}