对数据进行压缩 然后枚举每个矩形即可
#include "stdio.h"
#include "string.h"
#include "math.h"
int a[1001][1001];
int main()
{
int ans,count,k,t,n,m,x,y,i,j;
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d%d",&n,&m,&y,&x);
memset(a,0,sizeof(a));
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
scanf("%d",&k);
a[i][j]+=k+a[i][j-1];
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
a[i][j]+=a[i-1][j];
ans=0;
for (i=1;i+x-1<=n;i++)
for (j=1;j+y-1<=m;j++)
{
count=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1];
if (count>ans) ans=count;
}
printf("%d\n",ans);
}
return 0;
}