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

成员:林彦汝、张金

(这次角色调换,我主要负责代码复审,代码测试计划;张金负责程序分析,代码编程。)

题目:

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

要求:

  输入一个二维整形数组,数组里有正数也有负数。

  二维数组首尾相接,象个一条首尾相接带子一样。

  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

  求所有子数组的和的最大值。

思路:   

  在求一维环形数组和二维数组最大子数组的和的基础上,我们将两个的方法综合起来求解关于二维环形数组。假设原二维数组a[3][3]为


1


-2


3


1


-3


2


3


-4


5

在创建一个新的二维数组b[3][5]为


1


-2


3


1


-2


1


-3


2


1


-3


3


-4


5


3


-4

把它分割为三个子数组,分别为:


1


-2


3


1


-3


2


3


-4


5


-2


3


1


-3


2


1


-4


5


3


3


1


-2


2


1


-3


5


3


-4

每个子数组都像之前二维数组那样的方法,求出每个子数组的最大子数组,最后再比较。

源代码:

#include<iostream.h>
#include<conio.h>
int main()
{
    int i,j;
    int a[3][3];
    int b[3][5];
    int jixu;
    cout<<"本程序解决3*3矩阵的首尾相连求最大子矩阵和的问题"<<endl;
    cout<<"请输入3*3矩阵的各个数值"<<endl;
    for(i=0;i<3;i++)
    {
	for(j=0;j<3;j++)
	{
	    cin>>a[i][j];
	}
}
    int max=a[0][0];
    cout<<"初始二维数组为:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<a[i][j]<<‘ ‘;
        }
        cout<<endl;
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            b[i][j]=a[i][j];
	    b[i][j+3]=a[i][j];
	 }
    }
    cout<<"首尾相连后的数组为:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            cout<<b[i][j]<<‘ ‘;
        }
        cout<<endl;
    }
    for(i=0;i<1;i++)
    {
        b[0][0]=a[0][0];
        for(j=0;j<5;j++)
        {
            if(a[0][j-1]<0)
            {
                b[0][j]=a[0][j];
            }
            else
            {
                b[0][j]=b[0][j-1]+a[0][j];
            }
        }
    }
    for(i=1;i<3;i++)
    {
        for(j=0;j<1;j++)
        {
            if(a[i-1][0]<0)
            {
                b[i][0]=a[i][0];
            }
            else
            {
                b[i][0]=b[i-1][0]+a[i][0];
            }
        }
    }
    for(i=1;i<3;i++)
    {
        for(j=1;j<5;j++)
        {
            if(b[i-1][j-1]<0)
            {
                if(b[i-1][j]>=0&&b[i][j-1]>=0)
                {
                    if(b[i][j-1]>=b[i-1][j])
                    {
                        b[i][j]=b[i][j-1]+a[i][j];
                    }
                    else
                    {
                        b[i][j]=b[i-1][j]+a[i][j];
                    }
                }
                else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                {
                    b[i][j]=b[i-1][j]+a[i][j];
                }
                else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                {
                    b[i][j]=b[i][j-1]+a[i][j];
                }
                else
                {
                    b[i][j]=a[i][j];
                }
            }
            else
            {
                if(b[i-1][j]>=0&&b[i][j-1]>=0)
                {
                    b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
                }
                else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                {
                    b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
                }
                else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                {
                    b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
                }
                else
                {
                    b[i][j]=a[i][j];
                }
            }
        }
    }
    cout<<"求最大子矩阵和的中间过程:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            if(b[i][j]>max)
            {
                max=b[i][j];
            }
        }
    }
    cout<<"所求二维数组的最大字数组和为:"<<max+1<<endl;
    cout<<"是否要继续此过程(jixu)1,继续 0,退出"<<endl;
    cin>>jixu;
    if(jixu==1)
    {
	cout<<endl;
	main();
    }
    else
    {
	return 0;
    }
    getch();
    return 0;
}

运行结果:

  

总结:

这次我和小伙伴互换了角色,我主要负责代码审查。首先我们确定了思路和解决方法的方向,由于时间的安排,代码的主体一起讨论编写完,而循环找出最大子数组等一些细节是一个人写的。在后来审查代码的时候,发现有些地方跟之前讨论的和前一次二维数组的方法有些不一样,可能是因为我们的思维方式和掌握求解问题的方法不同。

  在测试多组数据后发现了一些问题和缺陷,告诉了搭档,进行修改完善。关于3*3这个固定的二维数组,这个局限性很大,还没有修改。

  经过这几次的课堂练习,我发现弱点在于确定思路。虽然在看到问题后会突然冒出很多想法,但提出之后就想出更多的特殊情况来一一否定自己,再听在讲台上发言的同学分享他们自己的思路后(其实有些跟自己的差不多一样),又觉得确实可行。

时间: 2024-08-25 17:07:28

求数组中最大子数组的和(二维环)的相关文章

求二维数组中最大子数组的和

一.题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二:结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三:设计思路: 将二维数组的每行轮番逐次相加(包括单行)后看成一维数组,利用求

求数组中最大子数组的和(1000)

成员:林彦汝.张金 题目: 返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. (我主要负责程序分析,代码编程:张金负责代码复审,代码测试计划.) 思路: 通过第一次求一个一维数组中最大子数组的和,在此基础上我们做了扩展.前面在程序中我们固定了数组的长度,默认为5,而这次则按题目要求扩展到1000,定

结对编程之求首尾相连数组中最大子数组的和

1.题目: 返回一个整数数组中最大子数组的和. 2.要求: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.同时返回最大子数组的位置.求所有子数组的和的最大值.要求时间复杂度为O(n). 3.设计思想: 分情况讨论最大子数组可能出现的情况,第一种为正常情况,没有超过数组范围,第二种则比较复杂,要用到环的一部分元素,分而求出两

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

返回一个整数数组中最大子数组的和4

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

二维数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 借鉴网上代码整理得思路: 根据一位数组最大子数组求和的编程思路,讲二维数组转化成一维数组求解: 即求出每一行的最大子数组之和,通过比较各行最大子数组之和的大小,求出只有二维数组只有一行的情况下的最大子数组之和: 然后求每两行最大子数组之和,即将每两行的相同列相加,将二维数

整数数组中最大子数组的和有溢出如何处理

一.实验题目: 返回一个整数数组中最大子数组的和. 二.实验要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 要求程序必须能处理1000 个元素:, 每个元素是int32 类型的: 求所有子数组的和的最大值. 三.实验思路: 这次的实验是在上次的基础上改进的,初看上去需要进步的地方不大,但是 仔细想起来,确实难度不小.处理1000个元素,很容易内存溢出:然后每 个元素是int32类型的,这很容易数据溢出.这次的实验着重的要解决这个