求二维数组最大子数组之和(不能运行)

上星期做了关于一维数组的子数组最大和求值问题。但是相对于二维数组来说复杂了好多。

对于这个程序,没能运行出来,有点遗憾,但是有一些思想还是可以实现的。

我们可以先求子矩阵的部分和,利用已经求出的部分和,来解出当前要求的矩阵的部分和,
定义一个部分和数组PartSum,其中PartSum[i][[j]代表了下标(0,0),(0,j),(i,0),(i,j)包围的区间的和。
求PSum部分和数组了

nt PSum[N+1][M+1];  

    int i,j;  

    for(i=0;i<=N;i++)  

        PSum[i][0]=0;  

   for(j=0;j<=M;j++)  

        PSum[0][j]=0;  

  for(i=1;i<=N;i++)  

      for(j=1;j<=M;j++)

           PSum[i][j]=PSum[i-1][j]+PSum[i][j-1]-P[i-1][j-1]+array[i-1][j-1];  
  1. 之后就是求二维数组的连续子数组之和的最大值  
  1. int MaxSum(int (*array)[N])  
  2. {  
  3.     int PartSum[N+1][M+1];  
  4.     int i,j;  
  5.     for(i=0;i<=N;i++)  
  6.         PartSum[i][0]=0;  
  7.     for(j=0;j<=M;j++)  
  8.         PartSum[0][j]=0;  
  9.     for(i=1;i<=N;i++)  
  10.         for(j=1;j<=M;j++)  
  11.             PartSum[i][j]=PartSum[i-1][j]+PartSum[i][j-1]-PartSum[i-1][j-1]+array[i-1][j-1];  
  12.     int MaxSum=-INFINITY;//初始化  
  13.     int imin,imax,jmin,jmax;  
  14.     for(imin=1;imin<=N;imin++)  
  15.         for(imax=imin;imax<=N;imax++)  
  16.             for(jmin=1;jmin<=M;jmin++)  
  17.                 for(jmax=jmin;jmax<=M;jmax++)  
  18.                         MaxSum=MaxNum(MaxSum,PartSum[imax][jmax]-PartSum[imin-1][jmax]-PartSum[imax][jmin-1]+PartSum[imin-1][jmin-1]);  
  19.                           
  20.     return MaxSum;  

// MaxMatrix.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <limits>
using namespace std;

#define N 4
#define M 3

int BC(int (*PartSum)[M+1],int imin,int imax,int j) //imin--imax第j列的和
{
int value;
value=PartSum[imax][j]-PartSum[imin-1][j]-PartSum[imax][j-1]+PartSum[imin-1][j-1];
return value;
}

//求二维数组的连续子数组之和的最大值
int MaxSum(int (*array)[M])
{
int PartSum[N+1][M+1];
int i,j;
for(i=0;i<=N;i++)
PartSum[i][0]=0;
for(j=0;j<=M;j++)
PartSum[0][j]=0;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
PartSum[i][j]=PartSum[i-1][j]+PartSum[i][j-1]-PartSum[i-1][j-1]+array[i-1][j-1];
int MaxSum=INT_MIN;
int Start,All;
int imin,imax;
for(imin=1;imin<=N;imin++)
{
for(imax=imin;imax<=N;imax++)
{
Start=BC(PartSum,imin,imax,M);
All=BC(PartSum,imin,imax,M);
for(j=M-1;j>=1;j--)
{
if(Start>0)
Start+=BC(PartSum,imin,imax,j);
else
Start=BC(PartSum,imin,imax,j);
if(Start>All)
All=Start;
}
if(All>MaxSum)
MaxSum=All;
}
}
return MaxSum;
}


int _tmain(int argc, _TCHAR* argv[])
{
int a[N][M]={
1,2,3,
4,0,-2,
-8,2,2,
9,3,-4
};
int maxSum=MaxSum(a);
cout<<maxSum<<endl;
getchar();

return 0;

下面是课堂上讨论时的笔记;
}

posted on 2014-03-19 20:34  爱你自己  阅读(314)  评论(1编辑  收藏  举报

导航