http://acm.hdu.edu.cn/showproblem.php?pid=1559
最大子矩阵
Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3859 Accepted Submission(s): 1967
Problem 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
最大子矩阵和问题,与hdu1081相似,这里多了一个规定的子矩阵的范围,所以只要在找子矩阵时保证子矩阵范围是所要求的范围就可以了
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int a[1100][1100]; 7 int main(){ 8 int n, m, i, j, k, T, x, y; 9 cin>>T; 10 while(T--){ 11 cin>>n>>m; 12 cin>>x>>y; 13 memset(a, 0, sizeof(a)); 14 for(i=1; i<=n; i++){ 15 for(j=1; j<=m; j++){ 16 cin>>a[i][j]; 17 a[i][j] += a[i-1][j]; 18 } 19 } 20 int mmax = -1000000, sum; 21 for(i=x; i<=n; i++){ 22 for(j=1; j<=m-y+1; j++){ 23 sum = 0; 24 for(k=j; k<j+y; k++){ 25 sum += (a[i][k]-a[i-x][k]); 26 } 27 if(sum > mmax) 28 mmax = sum; 29 if(sum < 0) 30 sum = 0; 31 } 32 } 33 cout<<mmax<<endl; 34 } 35 return 0; 36 }