通过确定矩阵区域的上下边界,将二维问题转化为一维问题。时间复杂度转化为O(N*M*min(N,M))具体分析见编程之美。
代码如下:
#include <stdio.h>
#include <limits.h>
int BC(int** A, int, int, int);
int maxSum(int** A, int n, int m)
{
int maximum = INT_MIN;
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
int nStart = BC(A, i, j, m-1);
int nAll = BC(A, i, j, m-1);
for (int k = m-2; k >= 0; k--)
{
if (nStart < 0)
{
nStart = 0;
}
nStart += BC(A, i, j, k);
if (nStart > nAll)
{
nAll = nStart;
}
}
if (nAll > maximum)
{
maximum = nAll;
}
}
}
return maximum;
}
int BC(int** A, int i, int j, int m)
{
int sum = 0;
for (int k = i; k <= j; k++)
{
sum += A[k][m];
}
return sum;
}
int main()
{
int n, m, sum;
int** A;
printf("please input n and m:\n");
while (scanf("%d %d",&n,&m)!=EOF)
{
A = new int*[n];
for (int i = 0; i < n; i++)
{
A[i] = new int[m];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%d",&A[i][j]);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%d ",A[i][j]);
}
printf("\n");
}
sum = maxSum(A, n, m);
printf("the max sum is %d",sum);
for (int i = 0; i < n; i++)
{
delete[]A[i];
}
delete[]A;
printf("please input n and m:\n");
}
}