题目:返回一个二维整数数组中最大子数组的和。

#include<iostream>    
#include<ctime>
using namespace std;
#define M 4
#define N 4

int maxline(int *array, int len)       //求一维数组最大子序列和  
{
    int i, sum = array[0], b = 0,j = 0;
    for (i = 0; i<len; ++i)
    {
        if (b>0)
            b += array[i];
        else
            b = array[i];
        if (b>sum)
            sum = b;            
    }
    return sum;
}
int maxtwodimension(int n, int m, int array[M][N])
{
    int i, j, h,g, max, sum = -1000;
    int b[100];
    for(g = 0;g < m;g++){
        for (i = 0; i<n; i++)
        {
            memset(b, 0, sizeof(b));       //将b[100]中的数字全部初始化为0  
            for (j = i; j<n; j++)          //把第i行到第n行相加,对每一次相加求出最大值  
            {
                for (h = g; h<m; h++)
                {
                    b[h] += array[j][h];   //求一行的和,二维数组压缩成一维数组  
                }
                max = maxline(b, h);   //按照一维数组求最大子数组的方法,求最大子序列和

                if (max>sum)
                    sum = max;
            }
        }
    }

    return sum;
}
int main()
{
    int arr[M][N];
    cout << "随机二维数组为:" << endl;
    srand((unsigned)time(0));
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            arr[i][j] = rand() % 100-25;
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    cout <<"最大子矩阵和为:  "<< maxtwodimension(M, N, arr) << endl;
    return 0;
}

 

设计思路:我还是根据一维数组的求解过程,把二维数组先求出每一行的和储存到一维数组中,根据一维数组的求解过程求出二维数组最大的数组,然后逐步缩小二维数组的行数和列数继续按照一维数组求最大子数组的方法求解。但是使用了o(n4)暂时还是想不出来o(n)的计算方法技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。