最大子矩阵

Tag动态规划    最大子矩阵                                          

问题描述:给定一个矩阵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;
}

posted on 2006-08-05 10:47  AnewR  阅读(1266)  评论(0)    收藏  举报