求二维数组最大子数组之和(不能运行)
上星期做了关于一维数组的子数组最大和求值问题。但是相对于二维数组来说复杂了好多。
对于这个程序,没能运行出来,有点遗憾,但是有一些思想还是可以实现的。
我们可以先求子矩阵的部分和,利用已经求出的部分和,来解出当前要求的矩阵的部分和,
定义一个部分和数组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];
- 之后就是求二维数组的连续子数组之和的最大值
- int MaxSum(int (*array)[N])
- {
- 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=-INFINITY;//初始化
- int imin,imax,jmin,jmax;
- for(imin=1;imin<=N;imin++)
- for(imax=imin;imax<=N;imax++)
- for(jmin=1;jmin<=M;jmin++)
- for(jmax=jmin;jmax<=M;jmax++)
- MaxSum=MaxNum(MaxSum,PartSum[imax][jmax]-PartSum[imin-1][jmax]-PartSum[imax][jmin-1]+PartSum[imin-1][jmin-1]);
- 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;
下面是课堂上讨论时的笔记;
}