方法一:求出所有的子矩阵然后再分别计算所有矩阵的和求最大的。复杂度较大,o(n4)
方法二:采用转化法,将矩阵问题,转化为一维问题(求最大子序列问题)。
#include "stdafx.h"
#include <iostream>
using namespace std;
#define MIN -10000
int ** a;
int sum;
char * str;
int max_array(int * a, int n)
{
if (!a || !n)
return MIN;
int * p, * q;
int * end = a+n-1;
p = a;
q = p;
int sum = *p, maxSum = 0, max = MIN;
while (q<=end && p<=end)
{
if (*q > max)
max = *q;
if (q != p)
sum += *q;
if (sum < 0)
{
p = q+1;
q = p;
sum = *p;
}
else
{
if (maxSum < sum)
maxSum = sum;
++q;
}
}
// 当最后的maxSum<0时,即全部的值都小于0
// 此时找到最大的那个元素
if (maxSum == 0)
return max;
return maxSum;
}
int max_matrix(int n)
{
int i = 0;
int j = 0;
int max_sum = -65535;
int * b = new int[n];
for (i=0; i<n; ++i)
{
// 初始化辅助数组
for (j=0; j<n; ++j)
b[j] = 0;
// 逐行求和再求最大连续和
for (j=i; j<n; ++j)
{
for (int k=0; k<n; ++k)
b[k] += a[j][k];
int sum = max_array(b, n);
if (sum > max_sum)
max_sum = sum;
}
}
delete [] b;
b = 0;
return max_sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
a = new int* [4];
for (int i=0; i<4; ++i)
{
a[i] = new int[4];
for (int j=0; j<4; ++j)
cin>>a[i][j];
}
cout<<max_matrix(4)<<endl;
return 0;
}