最大子序列和的推广:最大子矩阵

#include<stdio.h>
#define INF 1000
#define N 4
#define M 4

int maxsubsum(int * arr, int Size)
{
    int maxSum = -INF;
    int sum = 0;
    int i;
    for( i = 0; i < Size; i++)
    {
        if(sum < 0)
        {
            sum = arr[i];
        }
        else
        {
            sum += arr[i];
        }
        if(sum > maxSum)
        {
            maxSum = sum;
        }
    }
    return maxSum;
}

//大力出奇迹!!!
int maxSubMatrix(int n, int m, int array1[M][N])
 {
     int i, j, h, max1, sum = -INF;
     int b[100]={0};
     for (i = 0; i<n; i++)
    {

        for ( j = 0; j < 100; j++)
        {
                    b[j] = 0;
        }

        for (j = i; j<n; j++)          //把第i行到第j行相加,对每一次相加求出最大值
        {
           for (h = 0; h<m; h++)
            {
                 b[h] += array1[j][h];   //二维数组压缩成一维数组,然后求最大子序列和
            }
             max1 = maxsubsum(b, h);

             if (max1>sum)
                sum = max1;
        }
    }
     return sum;
 }

以上是程序的主代码

 

算法思路

在二维数组(m行,n列)中选出数行,成为二维子矩阵。该子矩阵列数不变而行为原先的子集。再将子矩阵按列求和成为b(n)。

利用先前的求数列最大子序列值的函数,可以求得b(n)的最大子序列。再依次遍历所有的行,得到最大值,而这个值就是二维数组的最大子矩阵的值。

复杂度为O(N^3)

截图:

posted on 2018-10-21 17:54  刘浩20160729  阅读(115)  评论(0编辑  收藏  举报

导航