二维数组求最大子数组

二维数组求最大子数组和(环形)

一、实验题目

      返回一个二维数组中最大子数组的和。

      实验要求:

      输入一个二维整形数组,数组里有正数也有负数。       二维数组首尾相接,象个一条首尾相接带子一样。       数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。       求所有子数组的和的最大值。要求时间复杂度为O(n)。 二、实验思路      这次我们设计的实验是手动输入二维数组的行数和列数,二维数组的环形求和我们设计的思路和一位数组的类似,就是把求完的数组的第一列放到最后,依次类推。求最大的子数组和时和二维数组的求和类似,即:输入的二维数组是 -1  2                                                                            3  4      

                                                                          -5  9

    (1)首先计算出第一行中有关-1的所有的子数组,然后计算出有关2的子数组,同样的道理可以计算第二行和第三行中的字数组。  

    (2)把上面计算出来的有关行中的子数组放在一个  b[3][3]即为 -1  1  2        的数组中。 

                                                                                         3  7  4                      

                                                                                       -5  4  9   

     (3)再求b[3][3]中的子数组的最大值,这次应该是按列来求。首先计算第一列中的子数组中的最大的数,先计算-1,然后计算-1+3,然后计算 -1+3+5,求出最大的来,再3+(-5)和max比较大小,求出最大的,再(-5)和max比较大小。同理求第二、三列。即可得出最大的来。

三、源程序

//信1201-2班 司新红 万彤
#include "stdafx.h"
#include "iostream"
using namespace std;
int main()
{
    int hang,lie;
    int a;
    int i,j;
    int s;//    求和
    int count;
    int max;
    cout<<"请输入二维数组的行数:";
    cin>>hang;
    cout<<"请输入二维数组的列数:";
    cin>>lie;    
    int **A;//定义动态二维数组
    int **B;
    a=lie*lie;
    A=new int*[hang];
    for(int k=0;k<hang;k++)
    {
        A[k]=new int[lie];
    }
    B=new int*[hang];
    for(int l=0;l<hang;l++)
    {
        B[l]=new int[a];
    }

    /*数组初始化*/

    cout<<"请输入二维数组中的元素"<<endl;
    for(int i=0;i<hang;i++)
    {
        for(int j=0;j<lie;j++)
        {
            cin>>A[i][j];
        }
    }


    /*二维数组压缩函数*/


    for(i=0;i<hang;i++)
    {
        count=0;
        for(j=0;j<lie;j++)
        {
            s=0;
            for(int l=0;l<lie;l++)                            //每一行按顺序进行枚举存入数组中
            {
                s=s+A[i][l+j];
                B[i][count+l]=s;
            }
            count=count+lie;
            A[i][lie+j]=A[i][j];
        }
    }


    max=B[0][0];                                                //将数组的第一个数赋值给max
    for(j=0;j<a;j++)
    {
        for(i=0;i<hang;i++)
        {
            s=0;
            for(int r=0;r<hang-i;r++)
            {
                s=s+B[r+i][j];                            //逐列对数组进行枚举,求最大值
                if(max<s)
                {
                    max=s;
                }
            }
        }
    }
    cout<<"最大子数组之和为:"<<max<<endl;
    return 0;
}

四.实验截图

五.实验心得

我只能说老师真的是越来越为难我们了 ,我和小伙伴做了很多次的尝试才成功,其实如果上次做实验没有偷懒的话,这次的实验就不需要做这么大的手脚,其实每次的实验都是改动很小,但是由于上次的实验不是万精油,所有这次又得推翻重做。这是个教训,需要记住

posted on 2015-04-04 19:32  爱牵牛  阅读(266)  评论(0编辑  收藏  举报

导航