一篇讲解最大子矩阵的博客:http://blog.csdn.net/beiyeqingteng/article/details/7056687
To the Max Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 46737 Accepted: 24741Description
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle. As an example, the maximal sub-rectangle of the array: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 is in the lower left corner: 9 2 -4 1 -1 8 and has a sum of 15.Input
The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].Output
Output the sum of the maximal sub-rectangle.Sample Input
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2Sample Output
15题目大意
求一个n*n的矩阵的最大子矩阵和
代码
#include <cstring> #include <cstdio> #include <iostream> const int maxn=0x3f3f3f3f; using namespace std; int n; int a[110][110],b[110]; int ans=-maxn; int maxrow() { int i; int nowmax=0,summax=-maxn; for(i=0;i<n;++i) { if(nowmax<=0) nowmax=b[i];//a[i]作为新的起点 else nowmax+=b[i]; if(nowmax>summax) summax =nowmax; } return summax; } int main() { int i,j; scanf("%d",&n); for(i=0;i<n;++i) { for(j=0;j<n;++j) { scanf("%d",&a[i][j]); } } for(i=0;i<n;++i)//哪一行是子矩阵的起始行 { memset(b,0,sizeof(b));//这里要初始化 for(j=i;j<n;++j)//枚举行,前i到j行的最大子矩阵 { for(int k=0;k<n;++k)//枚举列 b[k]+=a[j][k];//b表示从第i行到第j行按列相加得到的一行数 int mmax = maxrow();//这一行的最大子段 if(ans<mmax) ans = mmax; } } printf("%d\n",ans); return 0; }
