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

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

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

n二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。

n求所有子数组的和的最大值。要求时间复杂度为O(n)。

组员:陈晨( 负责程序分析,代码编程),王颖瑞( 负责代码复审和代码测试计划)

思路:二维数组求最大子数组是从一维数组扩展而来,首先确定了最大上界的情况下在第一行开始确定最大子数组范围,对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行,对于以上产生的几个数组,进行一维数组求子数组之和最大值的方法。依次求出最大值,依次比较,保留最大的。是最大上界下降重复以上步骤。

对于求二维数组的子数组之和,思路和求一维数组的相差不多,但需要分析更多的情况,我跟舍友讨论之后,之后写的。以下是我的思路:

   1.确定子数组的最大上界,从第一行依次向下,规定最大子数组的范围。

   2.对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行。(如第一组只有一行,第二组有两行等,列数和数组的列数相同)

   3.对于第二步产生的几个数组,进行一维数组求子数组之和最大值的方法。依次求出最大值,依次比较,保留最大的

   4.使最大上界下降1,重新第2 、3、4步。

代码:

#include<iostream>
using namespace std;
void main ()
{
	int x,y,i,j,m=0,A[100][100];

	cout<<"输入矩阵的行()和列";
	cin>>x>>y;
	if(x>100||y>100)
	{
		cout<<"请重新输入:";
		cin>>x>>y;
	}
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			cin>>A[i][j];
		}

	}
	int sum[100]={0},max=0,result=A[0][0];

	for(i=0;i<x;i++)//确定子数组的最大上界(为第i行)
	{
		while(m+i<x)//确定子数组有m+i行
		{
			//把子数组当成一位数组一样,求最大子数组的和
			for(j=0;j<y;j++)
			{
				sum[j]=sum[j]+A[m+i][j];

			}
			max=0;
			for(j=0;j<y;j++)
			{
				if(max+sum[j]>sum[j])
				{
					max=max+sum[j];
				}
				else
				{
					max=sum[j];
				}
				if(max>result)
				{
					result=max;
				}
			}
			m++;//是子数组的行数+1
		}
		//初始化m和sum[]的值,使子数组最大上界下降1,之后重新循环。
		m=0;
		for(j=0;j<y;j++)
		{
			sum[j]=0;
		}

	}

	cout<<result;
}

截图:

测试:

针对此次的程序主要进行了以下测试:

1.全负:输出矩阵中最大的负数

2.仅有1个值:输出本身

3.全为0:输出0

4.仅有一行或一列:输出正常

5.超出数组范围:重新输入(代码限制)

总结:二维数组求最大子数组是从一维数组扩展而来,一维数组可用线性解决,对于二位数组本来的想法是以O(n)的时间复杂度实现可经过自己查阅资料和同学讨论还是没有想出解决方案,最后只能把结果做出为目标制定了如上的思路,本次的任务依然是结对开发在这次的的开发过程中我和陈晨同学分工明确也渐渐找到了结对开发的一些注意的事项,在工作中也会有不同的的看法比如在讨论制定思路方面,我们面对意见不同时我们各自告诉对方自己的看法在分析谁的想法比较好这样也解决了问题,结对开发中收获了很多。

工作照:

时间: 2024-10-10 16:22:19

二维整数数组中最大子数组的和的相关文章

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的3*6的数据 我们决定设计一个3*6行的二维数组进行计算,依次进行比较 将最大子数组的和返回 代码 1 #include <iostream.h> 2 int main() 3 { 4 int a[3][6];//定义一个3*6的二维数组 5 int max; 6 int s;//求和 7 int count; 8 int b[3][7]; 9 cout<<"请输入二维数组(3*6)中的元素:"

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

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

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

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

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

1.题目. 题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思想. 分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵.比较其中最大的子矩阵值,找出最大的. 3.代码. #include<iostream> using namespace

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

题目:返回一个二维整数数组中最大子数组的和2 要求:输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 代码: 截图: 总结:

结对开发之《返回一个二维整数数组中最大子数组的和》

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划.发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月9日24:00) 二.编程思路 我们的思路比较简单,采用的是将

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

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 两人结对完成编程任务.一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月21日24:00) 二.设计思路 本次实验设计思路非常简单,就

返回一个二维整数数组中最大子数组的和(圆柱形)

题目: 返回一个二维整数数组中最大子数组的和 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 组员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路: 本次的任务是二维数组的环状求最大子数组,结合前两次的开发经验我们把一维数组环状的思路继续在二维数组中使用,首先输入数组时令数组的列扩大一倍,也就是令数组后的数组长度的值与前边的数

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

要求: 1.输入一个二维整形数组主,数组里有正数也有负数. 2.二维数组中连续的一个子矩阵组成一个子矩阵组成一个子数组,每个子数组都有一个和. 思路:根据上次写的找一维数组中最大子数组的经验,不妨把二维数组转化为一维数组的形式先进行求和,再比较,选出最大的子数组.首先以第一行为上界,依次向下确定数组的最大范围,把最大子数组按照一列有几个数,分成几种不同的行,对于产生数组的,进行一维数组求和计算并找出最大值.然后将上界下调一行,从第二行开始,依次向下确定数组最大范围,重复以上步骤. 代码如下: #