最大子矩阵和问题

从第一行到最后一行,将每一行的同列相加起来,可以得到一个一维数组,可以用最大子段和求这个一维数组中的最大子段,也就是最大子矩阵。
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;
}
点赞