问题描述:如:
1 2 0 -3 -4
-2 -3 4 5 1
-1 -1 5 3 0
中最大的二维矩阵是:
4 5 1
5 3 0
其元素和为18。
参考编程之美2.15:子数组之和的最大值(二维)
算法:假设矩阵为N行M列,枚举这个矩阵上下边界,然后再利用一维情况下的方法确定左右边界,就可以将二维问题的解。时间复杂度:O(N*N*M)
代码实现:
#include <cstdio>
#include <cstdlib>
#define N 3
#define M 5
int acc(int a[][M], int i, int j, int k); //将第i行和第j行之间的第k列的所有元素的和计算出来
int maxSum(int a[][M]);//计算二维数组子矩阵最大值
int main()
{
int array[N][M] = {
{ 1, 2, 0, -3, -4},
{-2, -3, 4, 5, 1},
{-1, -1, 5, 3, 0}
};
printf("the max value is : %d\n", maxSum(array));
system("pause");
return 0;
}
//将第i行和第j行之间的第k列的所有元素的和计算出来
int acc(int a[][M], int i, int j, int k)
{
int ret = 0;
for (int s = i; s <= j; s++)
ret += a[s][k];
return ret;
}
int maxSum(int a[N][M]) //两外层