http://acm.hdu.edu.cn/showproblem.php?pid=1559
将原来的矩阵
3 361 649 676 588
992 762 156 993 169
662 34 638 89 543
525 165 254 809 280
变化成子矩阵和的矩阵
比如sum(A1:C3) = sum(A1:B3) + sum(C1:C2) + a[ i ][ j ];
即代码中的map[ i ][ j ] += map[ i ][ j-1 ] + map[ i-1 ][ j ] - map[ i-1 ][ j-1 ];
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
const int N=1010;
using namespace std;
int map[N][N];
int main(){
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int cas;
scanf("%d",&cas);
while(cas--){
int m,n,x,y;
scanf("%d%d%d%d",&m,&n,&x,&y);
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
scanf("%d",&map[i][j]);
int ans = -1e9;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
map[i][j] += map[i][j-1] + map[i-1][j] - map[i-1][j-1];求每个子矩阵的和并保存起来,原理如上面讲解
// cout << map[i][j] << " ";
if(i>=x && j>=y){
int tmp = (map[i][j] - map[i-x][j]) - (map[i][j-y] - map[i-x][j-y]);///x行前j列的和-x行前j-y列的和=x行y列的和
ans = max(ans, tmp);
}
}
// cout << endl;
}
printf("%d\n",ans);
}
return 0;
}