最大子矩阵
问题描述:给定一个矩阵A[n][m], 求其子矩阵中所有元素和最大的子矩阵。
思路:我们知道求数组的最大子串和,推广到矩阵的最大子矩阵和。可以基于下面的等式:
S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + E[i][j].其中S[i][j] 表示矩阵A[i][j]所有元素的和,E[i][j]表示第i行j列的元素大小。通过这个递推公司可以得到O(n^4)复杂度的算法。这里我介绍另外一种算法,其复杂度是O(n^3)的。思路如下:先从第一行开始得到以第一行元素为首行的子矩阵的最大和,然后是以第二行为首行的子矩阵的最大和,以此类推,得到最后的最大和。算法实现如下:
/*求数据A的最大子串和*/
int Util::maxsubarray(int* A, int n)
{
int maxsum = 0;
int cursum = 0;
for (int i = 0; i < n ; i++)
{
if (cursum <= maxsum)
cursum += A[i];
else
maxsum = cursum;
if (cursum < 0)
cursum = 0;
}
return maxsum;
}
/*求矩阵A的最大子矩阵和*/
int Util::maxsubmatrix(int** A, int n, int m)
{
int * B = (int *)calloc(m, sizeof(int));
int maxsum = 0;
int cursum = 0;
for (int i = 0; i < n; i ++)
{
memset(B, 0, m);
for ( int j = i; j < n; j ++)
{
for (int l = 0; l < m; l++)
B[l] += A[j][l];
cursum = maxsubarray(B, m);
if (cursum > maxsum)
maxsum = cursum;
}
}
free[] B;
return maxsum;
}
浙公网安备 33010602011771号