题目:
求一个M*N的矩阵的最大子矩阵和。
比如在如下这个矩阵中:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
拥有最大和的子矩阵为:
9 2
-4 1
-1 8
其和为15。
思路:二维转成一维,用一维的最大连续子序列求和即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*从a中找到最大连续子序列的和*/
int getSubMaxSum(int *a, int n)
{
int sum = *a;
int tmp = 0;
int i;
for (i=0; i<n; i++)
{
tmp += a[i];
/*如果当前和比历史记录大,则更新*/
if (tmp > sum)
{
sum = tmp;
}
if (tmp < 0)
{
/*如果小于0,则从下一个重新开始计算*/
tmp = 0;
}
} return sum;
}
/*row:行长度
col:列长度
算法思想参考:http://blog.csdn.net/YCH1035235541/article/details/8260687
*/
int getSubMaxArray(int arr[][4], int row, int col)
{
int i;
int j;
int k;
int sum = 0;
int tmp = 0;
int rec[255];
for (k=0; k<row; k++)/*k表示从k开始求最大子矩阵*/
{
memset(rec, 0, sizeof(rec));
for (i=k; i<row; i++)
{
for (j=0; j<col; j++)
{
rec[j] += arr[i][j]; /*累加a[k][0]到a[row][col]的值到数组*/
}
tmp = getSubMaxSum(rec, col);
if (sum < tmp)
{
sum = tmp;
}
}
}
return sum;
}
int main()
{
int a[][4] =
{
{0, -2, -7, 0},
{9, 2, -6, 2},
{-4, 1, -4, 1},
{-1, 8, 0, -2},
};
printf("sum %d\n", getSubMaxArray(a, 4, 4));
return 0;
}