#include <iostream>
using namespace std;
int PS[4][5];
void calculateBound(int B[3][4], int N, int M)
{
int i, j;
for (i = 0; i <= N; i++)
{
PS[i][0] = 0;
}
for (j = 0; j <= M; j++)
{
PS[0][j] = 0;
}
for (i = 1; i <= N; i++)
{
for (j = 1; j <= M; j++)
{
PS[i][j] = PS[i-1][j] + PS[i][j-1] - PS[i-1][j-1] + B[i-1][j-1];
}
}
}
int BC(int a, int c, int m)
{
return (PS[c][m]-PS[a-1][m]-PS[c][m-1]+PS[a-1][m-1]);
}
int maxSum(int B[3][4], int N, int M)
{
int arrayMaxSum = INT_MIN;
int i, j, k;
int arrayStart, arrayAll;
for (i = 1; i <= N; i++)
{
for (j = i; j <= N; j++)
{
arrayStart = BC(i, j, M);
arrayAll = BC(i, j, M);
for (k = M-1; k >= 1; k--)
{
if (arrayStart < 0)
{
arrayStart = 0;
}
arrayStart += BC(i, j, k);
if (arrayStart > arrayAll)
{
arrayAll = arrayStart;
}
}
if (arrayAll > arrayMaxSum)
{
arrayMaxSum = arrayAll;
}
}
}
return arrayMaxSum;
}
int main()
{
int N = 3;
int M = 4;
int A[3][4] = {1, 2, 3, 4, -4, 5, 6, 7, 0, 11, 23, 45};
calculateBound(A, 3, 4);
cout<<maxSum(A, N, M);
}
编程之美 子数组之和的最大值(二维)
最新推荐文章于 2018-06-26 17:01:06 发布