方法:先将x个行压缩成一行,然后再求连续y个最大子序和。
数据范围不是1000,真坑。
#include<iostream>
#include<cstdio>
#include<cstring>
typedef __int64 LL;
using namespace std ;
const int N=2005;
int a[N][N];
LL b[N];
LL Maxsum(int n,int k,LL *s)
{
LL ans=0;
for(int i=0;i<n;i++){
LL sum=s[i];
for(int j=i+1;j-i<k;j++) sum+=s[j];
ans=max(ans,sum);
}
return ans;
}
int main()
{
int n,m, x,y,k;
LL ans;
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d %d",&n,&m,&x,&y);
ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<=n-x;i++){
memset(b,0,sizeof(b));
for(int j=i;j-i<x;j++){
for(k=0;k<m;k++){
b[k]+=a[j][k];
}
}
ans=max(Maxsum(m,y,b),ans);
}
printf("%I64d\n",ans);
}
return 0 ;
}