求2维数组的子数组(子矩阵)和的最大值

      上节课老师留的是求一维数组的子数组的和的最大值,我采用的方法是以第一个元素为起点,判断前一个元素,前2个元素,一直到前n个元素,求它们中的最大值,然后以第二个元素为起点,求前一个元素,前2个元素,一直到前n-1个元素,求它们中的最大值,然后对以每个元素为起点的最大子数组的值进行排序,从而求得整个一维数组的子数组的最大值。

      而这节课,老师给我们增加了难度,求二维数组的子数组(子矩阵)的和的最大值,我认为是一维数组的推广,对于一维数组的方法,二维数组仍可用,但是要复杂的很多。我的思路是先求每行子数组的最大值,然后在所有一行的子数组中求最大的一行子数组的值。接下来,我把前2行元素合为一行,也就是把每列的2行元素相加,这样2行数组就又变为了一维数组,然后仍采用求一维子数组的和的最大值的方法,接下来,把第二行和第三行合并为一行,再用这种方法做,然后依次类推。可求得2行数组的子数组的最大值。后面的也是如此,把前三行合并为一行,前四行。。。。。。

      这种方法虽然看上去可行,但是实际编写的代码太多,且复杂度很高,这种方法的关键是形成通式,就像数学中多种情况可以用同一个式子表达出来,所以我想到了函数,但是在尝试了后,感觉此方法行不通,首先需要传输的参数太多,且参数的实时性要求很高,函数的编写同样也很复杂,且效率很低。假如是很小的2维数组,或许可以实现,但是如果是很小的二维数组也就没必要再编写函数了,列举,合并,就可以实现,所以最终我们用的只是列举的方法,求出每种情况的最大值,然后再比较,求出最后的最大值。

      下面是求一行数组子数组的最大值的代码:

for(i=0;i<4;i++)
    {
        for(x=0;x<4;x++)
        {
            m=a[i][x];
            n=a[i][x];
            j=x;
            while(j<4)
            {
                if(m<n)
                {
                   m=n;
                }
                if(j<3)
                {
                    j++;
                    n=a[i][j]+n;
                }
                else 
                    j++;
            }
            b[x]=m;
        }
        y=b[0];
        for(t=0;t<4;t++)
        {
            if(y<b[t])
                y=b[t];
        }
        c[i]=y;
    }

王丹---20112791
祁子梁--20112782

原文地址:https://www.cnblogs.com/wangdan/p/3611392.html