zoukankan      html  css  js  c++  java
  • 求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

  • 相关阅读:
    NYOJ 260
    NYOJ 271
    [转载]《博客园精华集》Winform筛选结果(共105篇)
    在DataGridView控件中加入ComboBox下拉列表框的实现
    给SQL补充一个查看表结构的存储过程
    编写自定义控件之下拉式属性
    PropertyGrid中的枚举显示为中文(转)
    DataGridView 中合并单元格
    树TreeView控件与DataTable交互添加节点(最高效的方法)
    通过键盘方向键控制TreeView节点的移动
  • 原文地址:https://www.cnblogs.com/wangdan/p/3611392.html
Copyright © 2011-2022 走看看