从第一行到最后一行,将每一行的同列相加起来,可以得到一个一维数组,可以用最大子段和求这个一维数组中的最大子段,也就是最大子矩阵。
eg:矩阵为4 -2 9
-1 3 8
-6 7 6
09 -5
4-2 9 4 -2 9 4 -2 9 4 -2 9
-1 3 8 -1 3 8 -1 3 8
-6 7 6 -6 7 6
09 -5
-1 3 8 -1 3 8 -1 3 8
-6 7 6 -6 7 6
0 9 -5
-6 7 6 -6 7 6
0 9 -5
09 -5
#define M 4
#define N 4
int maxSum(int *arr,int n)//最大子段和
{
int sum = 0;
int max = 0;
for(int i=0;i<n;i++)
{
if(sum > 0)
sum += arr[i];
else
sum = arr[i];
if(sum > max)
max = sum;
}
return max;
}
int maxSum2(int arr[M][N],int m,int n)//最大子矩阵和
{
int sum = 0;
int *b = new int[n+1];
for(int i=0;i<m;++i)//枚举行
{
memset(b,0,sizeof(int)*n);
for(int j=i;j<m;j++)//枚举初始行i到j行
{
for(int k=0;k<n;++k)
{
b[k] += arr[j][k];//b[k]为纵向列之和
int max = maxSum(b,n);
if(max > sum)
sum = max;
}
}
}
return sum;
}
int main()
{
int arr[][N] = { {0,-2,-7,0},{9,2,-6,2},{-4,1,-4,1},{-1,8,0,-2} };
for(int i=0;i<M;++i)
{
for(int j=0;j<N;++j)
cout<<arr[i][j]<<ends;
cout<<endl;
}
cout<<endl;
cout<<"矩阵arr的最大连续子段和为:"<<maxSum2(arr,M,N);
return 0;
}