求二维数组的最大子数组 ZOJ1074
/* 题目描述:求一个n*n二维矩阵的最大子矩阵,maxSum。 */ #include<iostream> #include<vector> #include<cstdio> #include<cstring> #include<assert.h> using namespace std; //Problem C //2012-7-10 //by frank const int N = 103; const int INF = -9999; /* 算法思想:对于一维的数组,我们可以很容易用动态规划的方法求得最大子数组; 所以我们将i=[0...n], j[i..n]枚举所有行的可能,然后再对每一种可能(此时可以 将它看做是一维数组的情况),用DP求得其最大子数组。 算法时间复杂度o(n^3)。 */ int maxSubArray(int a[], int n) { assert(a!=NULL && n>0); int cur = 0; int max = INF; for(int i=0; i<n; i++) { cur += a[i]; //当cur小于0时,应该重新开始计数. if(cur < 0) cur = 0; if(cur > max) max = cur; } return max; } int findMaxSubMatrix(int a[][N], int n) { int tmpSum[N]; int max = INF; //枚举所有行的可能组合。 for(int i=0; i<n; i++) { //将tmpSum清零。 memset(tmpSum,0,sizeof(tmpSum)); for(int j=i; j<n; j++) { //加上当前行的元素。 for(int k=0; k<n; k++) tmpSum[k] += a[j][k]; int tmpMax = maxSubArray(tmpSum, n); if(tmpMax > max) max = tmpMax; } } return max; } int main() { int a[N][N]; int n = 0; while(cin>>n && n) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>a[i][j]; cout<<findMaxSubMatrix(a, n)<<endl; } return 0; }
多学习,多总结。