二维数组-最大子数组

浪子不回头ぞ 提交于 2020-01-11 20:53:52

一 题目:求二维数组中最大子数组的和

结对开发人员:

朱少辉:负责程序分析,代码编程

侯涛亮:负责代码复审和代码测试

二 设计思路

      我认为若想求二维数组中最大子数组,可以将二维数组化为一维数组,在对其求连续子数组最大值。那么如何将一个二维数组化为一维数组呢?可以举一个例子,如下:

i=0   5    6  -3   8  -9   2

i=1  1   -12   20  0   -3  -5

i=2   -9  -7  -3  6   7   -1

例子为一个3*6矩阵,令其为a[3][6]。由于可以行行相加或列列相加转化为一维数组,在这为行行相加,故附设一个一维数组是s[6],初值均为0。附设两变量SUM和MAX,max初始值为a[0][0]即5。当i=0时,将a[0][0]-a[0][5]的值赋给s[6],用求一维最大子数组的方法求得最大值赋给MAX,然后,再将i=1行的元素加到第一行(即s[j]=s[j]+a[1][j])再赋值给s[6],求最大子数组,然后接着将第三行元素往上加(即s[j]=s[j]+a[2][j]),最后求得含第一行元素的子矩阵的最大值。把s[6]回归为0。同理,从第二行开始,依次往下加,从第三行开始....最后可求得最大子矩阵的值。这种算法的时间复杂度为O(n^3).

三 代码实现

#include<iostream>
using namespace std;

void main()
{
    int m,n,i,j,a[100][100];
    cout<<"请输入矩阵的大小(m*n):";
    cin>>m>>n;
    cout<<"请输入矩阵:"<<endl;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    int sum,max=a[0][0],s[100],k=0;
    for(j=0;j<n;j++)
    {
        s[j]=0;
    }
    for(i=0;i<m;i++)
    {
        while(k+i<m)
        {
            for(j=0;j<n;j++)
            {
                s[j]=s[j]+a[k+i][j];
            }
            sum=0;
            for(j=0;j<n;j++)
            {
                if(s[j]+sum>s[j])
                {
                    sum=s[j]+sum;
                }
                else
                {
                    sum=s[j];
                }
                if(sum>max)
                {
                    max=sum;
                }
            }
            k++;
        }
        k=0;
        for(j=0;j<n;j++)
        {
            s[j]=0;
        }
    }
    cout<<"子矩阵最大值为"<<max<<endl;
}

 

四 截图

五 总结

       在结对开发过程中,我们一致认为需要将二维数组化为一维数组,再用一维数组的动态规划思想求解问题。然而这种算法的时间复杂度只能为O(n^3)。最后再怎么想,也很难降低时间复杂度。在代码测试阶段,需要考虑到多种情况,例如都为负数,或一行正一行负亦或者一列正一列负,还有数组越界等等情况都需考虑周到。在结对开发过程中,我们相互协作,尽力而为,高效率地完成了工作。

六 工作照

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!