题目链接:https://www.acwing.com/problem/content/101/
本题考察的主要知识点是二维前缀和的应用。
我们可以很明显得到一个推导公式:
s[i][j] = s[i-1][j] + s[i][j-1] -s[i-1][j-1] + a[i][j];
这个推导公式很容易就可以得到。所以可以在N^2的时间内得到二维数组的前缀和。
然后在枚举每个R长度的正方形即可。
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
int N,R;
int s[5010][5010];
int main()
{
scanf("%d%d",&N,&R);
for(int i = 1; i <= N; i ++)
{
int x,y,weight;
scanf("%d%d%d",&x,&y,&weight);
x ++; y ++;//题目的数据范围是从0开始的。我这里是从1开始的,所以需要加1;
s[x][y] = weight;
}
for(int i = 1; i <= 5008; i ++)
for(int j = 1; j <= 5008; j ++)
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + s[i][j];
int maxx = 0;
for(int i = R; i <= 5008; i ++)
{
for(int j = R; j <= 5008; j ++)
{
int ans = s[i][j] - s[i - R][j] - s[i][j - R] + s[i - R][j - R];
maxx = max(maxx,ans);
}
}
printf("%d\n",maxx);
}