作业思路:

用宏定义表示长和宽控制二维数组的大小。采取逐行轮换相加的方法依次求若干行的最大子数组的和,利用一个一维数组来储存逐行轮换相加得到的一维数组,
再在该数组里求一维数组的最大子数组的和,这样就把二维数组转换成了一维数组,问题就迎刃而解了。




#include<iostream>  
using namespace std;
#define M 4
#define N 4  
int maxSubArray(int *a, int len)   //最大子序列和  
{
    int i, sum = a[0], b = 0;
    for (i = 0; i<len; ++i)
    {
        if (b>0)
            b += a[i];
        else
            b = a[i];
        if (b>sum)
            sum = b;
    }
    return sum;
}
int maxSubMatrix(int n, int m, int array[M][N])
{
   int i, j, h, max, sum = -100000;
   int b[100];
   for (i = 0; i < n; i++)
   {
       memset(b, 0, sizeof(b));       //初始化b[]  
       for (j = i; j < n; j++)          //把第i行到第j行相加,对每一次相加求出最大值  
       {
           for (h = 0; h<m; h++)
           {
               b[h] += array[j][h];   //求最大子序列和  
           }
        max = maxSubArray(b, h);
        if (max>sum)
            sum = max;
       }
   }
   return sum;
}
int main()
{
int arr[M][N] = {{13, 5,-23,9}, {-17,21,30,12},{-111,0,21,13},{50,12,-10,18}};
cout << "最大子数组为:" << endl;
cout << maxSubMatrix(M, N, arr) << endl;
system("pause");
return 0;
}

 总结:

   目前程序大体上能运行出结果了,但是整个程序还有很大的不足,没有随机数的应用以及数组的输入必须在程序中进行等等一系列的问题,我们在查阅和讨论中认识到自己的不足之处。

结对(博客园id:绝望的暴风雨)