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


             前面在课程中通过对一维数组求子数组的最大值求法,我们是通过定义一个整数数组,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

  • 相关阅读:
    【SAS NOTES】将文本转化为数据格式 input()
    【SAS NOTES】proc tabulate遇到的问题
    【SAS NOTES】proc sql
    【SAS NOTES】转载 sas函数&模块
    【SAS NOTE】substr字符串提取函数
    【SAS NOTES】输出结果到excel
    【SAS NOTES】脏数据
    【SAS NOTES】字符串处理函数
    【SAS NOTES】实际分析应用
    多项式的乘法满足结合律和交换律
  • 原文地址:https://www.cnblogs.com/leejrove/p/3611366.html
Copyright © 2020-2023  润新知