题目:http://acm.hdu.edu.cn/showproblem.php?pid=1559
DP。。可以直接水过的。。先左右求和,然后从上向下扫一遍。。
下面是AC代码:
#include<iostream>
#include<cstring>
using namespace std;
const int MAX = 1010;
int a[MAX][MAX];
long long sum[MAX][MAX];
int main(){
int m,n,x,y,t;
cin>>t;
while(t--){
cin>>m>>n>>x>>y;
memset(sum,0,sizeof(sum));
for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>a[i][j],sum[i][j]=sum[i][j-1]+a[i][j];
long long ans=0,temp;
for(int i=y;i<=n;i++){
temp=0;
for(int j=1;j<=x;j++){
temp+=sum[j][i]-sum[j][i-y];
}
if(temp>ans) ans=temp;
for(int j=x+1;j<=m;j++){
temp+=(sum[j][i]-sum[j][i-y]); temp-=(sum[j-x][i]-sum[j-x][i-y]);
if(temp>ans) ans=temp;
}
}
cout<<ans<<endl;
}
return 0;
}