• 求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

  • 相关阅读:
    C#三种模拟自动登录和提交POST信息的实现方法
    关于c#调用C++代码的一些应用的体会
    c# 路径空格---ProcessStartInfo参数问题
    用C#调用Matlab图像处理自制QQ游戏2D桌球瞄准器
    使用C#开发纽曼USB来电小秘书客户端小结
    C#传递参数到线程的n个方法
    C# : 操作Word文件的API
    c# 导出Excel
    使用C#: 自动切换鼠标的左右手习惯
    Linux 系统的文件类型
  • 原文地址:https://www.cnblogs.com/wangdan/p/3611392.html
Copyright © 2020-2023  润新知