码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-04-13 14:10:48      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

#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)的计算方法技术分享

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

标签:

原文地址:http://www.cnblogs.com/laozhanghahaha/p/4421897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!