题目求的是最大矩阵,,,如果直接暴力肯定会超时,但是用了树状数组就一定不会超时的,,,,我算了的,,,,
在这个题目我们要知道的是,直接手撸一个二维树状数组,,
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 1005
int c[maxn][maxn];
int lowbit(int x)
{
return x&-x;
}
int n,m;
void add(int x,int y,int a)
{
for(int i=x;i<=m+1;i+=lowbit(i))
for(int j=y;j<=n+1;j+=lowbit(j))
{
c[i][j]+=a;
}
}
int sum(int x,int y)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
{
sum+=c[i][j];
}
return sum;
}
int main()
{
int T;
freopen("in.txt","r",stdin);
scanf("%d",&T);
int x,y;
while(T--)
{
memset(c,0,sizeof(c));
scanf("%d%d%d%d",&m,&n,&x,&y);
int a;
for(int i=2;i<=m+1;i++)
{
for(int j=2;j<=n+1;j++)
{
scanf("%d",&a);
add(i,j,a);
}
}
int ans=0;
for(int i=2;i<=m+2-x;i++)
for(int j=2;j<=n+2-y;j++)
{
int sum1=sum(i-1,j-1);
int sum2=sum(i-1,j+y-1);
int sum3=sum(i+x-1,j-1);
int sum4=sum(i+x-1,j+y-1);
// printf("%d %d %d %d\n",sum1,sum2,sum3,sum4);
ans=max(ans,sum4-sum2-sum3+sum1);
// printf("%d\n",ans);
}
printf("%d\n",ans);
}
return 0;
}