Description
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。
Output
对于每组数据,输出一个整数,表示子矩阵的最大和。
Sample Input
1 4 5 2 2 3 361 649 676 588 992 762 156 993 169 662 34 638 89 543 525 165 254 809 280
Sample Output
2474
用二维数组map[i][j]表示前i行第j个数的和,把前i行的和压缩到第i行上。
1 #include<cstdio>
2 #include<string.h>
3 int map[1010][1010];
4 int main()
5 {
6 int t;
7 int x,y,m,n,a,sum,max0;
8 scanf("%d",&t);
9 while(t--)
10 {
11 memset(map,0,sizeof(map));
12 scanf("%d %d %d %d",&m,&n,&x,&y);
13 for(int i = 1 ; i <= m ; i++)
14 {
15 for(int j = 1 ; j <= n ; j++)
16 {
17 scanf("%d",&a);
18 map[i][j]=map[i-1][j]+a; //map[i][j]表示前i行第j个数的和
19 }
20 }
21 max0=0;
22 for(int i = x ; i <= m ; i++) //i从第x行开始(第x行的值表示序列前x行的和)
23 {
24 for(int j = y ; j <= n ; j++)
25 {
26 sum=0;
27 for(int k = j-y+1 ; k <= j ; k++) //控制k的范围为y
28 {
29 sum+=(map[i][k]-map[i-x][k]); //求出x*y矩阵的和
30 }
31 if(sum > max0)
32 {
33 max0=sum;
34 }
35 }
36 }
37 printf("%d
",max0);
38 }
39 }