题目描述
http://acm.hdu.edu.cn/showproblem.php?pid=1559
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
题目分析
- 只是求所有x*y子矩阵的元素和,可以先预处理一下,再计算
代码
#include <iostream>
using namespace std;
#define N 1001
int dp[N][N];
int getMax(int a,int b){
return a>b?a:b;
}
int main() {
freopen("in.txt","r",stdin);
int T,n,m,x,y;
cin>>T;
while(T--){
cin>>m>>n>>x>>y;
int max=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>dp[i][j];
//预处理:所有(1,1)到(i,j)的矩阵元素和
dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
if(i>=x&&j>=y){
//算最大的x*y的子矩阵和
max=getMax(max,dp[i][j]-dp[i-x][j]-dp[i][j-y]+dp[i-x][j-y]);
}
}
}
cout<<max<<endl;
}
fclose(stdin);
return 0;
}