题意
给出一个矩阵,里面每个格子里面有一个价值,我们现在有一个 的框,求用这个框框住的子矩阵里的价值总和最大是多少。
思路
我们可以用二维前缀和记录一下每个点为右下角的子矩阵的价值总和,然后枚举一下就好了。
代码
#include<cstdio>
#define max(a,b) a>b?a:b
int n,r,s[5003][5003],a,b,c,ans;//这里用2个数组会爆
int main()
{
scanf("%d%d",&n,&r);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
s[a+1][b+1]=c;
}
for (int i=1;i<=5001;i++)
for (int j=1;j<=5001;j++)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//二维前缀和
for (int i=r;i<=5001;i++)
for (int j=r;j<=5001;j++)
ans=max(s[i][j]-s[i][j-r]-s[i-r][j]+s[i-r][j-r],ans);//枚举答案
printf("%d",ans);
}