#include<stdio.h> #define INF 1000 #define N 4 #define M 4 int maxsubsum(int * arr, int Size) { int maxSum = -INF; int sum = 0; int i; for( i = 0; i < Size; i++) { if(sum < 0) { sum = arr[i]; } else { sum += arr[i]; } if(sum > maxSum) { maxSum = sum; } } return maxSum; } //大力出奇迹!!! int maxSubMatrix(int n, int m, int array1[M][N]) { int i, j, h, max1, sum = -INF; int b[100]={0}; for (i = 0; i<n; i++) { for ( j = 0; j < 100; j++) { b[j] = 0; } for (j = i; j<n; j++) //把第i行到第j行相加,对每一次相加求出最大值 { for (h = 0; h<m; h++) { b[h] += array1[j][h]; //二维数组压缩成一维数组,然后求最大子序列和 } max1 = maxsubsum(b, h); if (max1>sum) sum = max1; } } return sum; }
以上是程序的主代码
算法思路
在二维数组(m行,n列)中选出数行,成为二维子矩阵。该子矩阵列数不变而行为原先的子集。再将子矩阵按列求和成为b(n)。
利用先前的求数列最大子序列值的函数,可以求得b(n)的最大子序列。再依次遍历所有的行,得到最大值,而这个值就是二维数组的最大子矩阵的值。
复杂度为O(N^3)
截图: