从一维数组扩展到二维数组求子数组的最大值

         前面在课程中通过对一维数组求子数组的最大值求法,我们是通过定义一个整数数组,a[n];n可以为任意正整数,然后我们又定义了子整数组和b[m],利用数学知识可以得到m=n*(n+1)/2;我们可以循环输入得到a[n],在这里,我们定义a[0]=b[0];然后,我们可以利用双重循环,b[i]=b[i-1]+a[i],这样我们得到了子整数数组和b[m],然后,我们利用冒泡排序法,可以得到最大的子整数组和,输出。但是复杂度太高,虽然最后实现了该方法。

          而后的课程,老师要求我们将一维的数组变成二维数组然后求子数组的最大值。起先我们认为只要将数组从一维改为二维就能实现,结果编程后发现不是这么回事。这种投机的方法不能乱用的。然后我们通过讨论和查阅资料  得出原数组B[M+1][N+1],但是存数的时候都是从1开始的,将B[i][0]和B[0][j]都初始化为0,方便未来的计算。下面计算以B[1][1]为左上角,右下角任意的矩形的元素和。用PS[M+1[N+1]存储。

        实现方法代码如下:

for(i=0; i<=M; i++)  
          PS[i][0]=0;  
    for(j=0; j<=N; j++)  
          PS[0][j]=0;  
    for(i=1;i<=M; i++)  
          for(j=1; j<=N;j++)  
              PS[i][j]=PS[i-1][j] + PS[i][j-1] -PS[i-1][j-1]+B[i][j];  
    int max 0;
    for(i_min=1; i_min<=M; i_min++)  
        for(i_max=i_min;i_max<=M; i_max++)  
            for(j_min=1; j_min<=M; j_min++)  
                for(j_max=i_min;j_max<=M; j_max++)  
                {  
                    sum = PS[i_max][j_max]-PS[i_min][j_max]-PS[i_max][j_min]+PS[i_min][j_min];  
                    if(max<sum)  
                        max=sum;  
                } 

      这种方法虽然能够实现,并且求出子数组的最大值,但是空间复杂度较高O(M^2 * N^2)。还有待改进

组员:

姜力比20112802 周亚豪20112832

原文地址:https://www.cnblogs.com/leejrove/p/3611366.html