二维数组子数组的最大值之和

题目:求一个二维数组中其子数组之和的最大值。

人员

陈晨:负责程序编写。

王颖瑞:负责代码复审和代码测试。

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

   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]={0};

	cout<<"输入矩阵的行和列";
	cin>>x>>y;
	if(x>100||x<0||y>100||y<0)
	{
		cout<<"输入错误,请重新输入";
		cin>>x>>y;

	}
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			cin>>A[i][j];
		}

	}
	int sum[100],max,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;
}

截图

工作照

总结:虽然这个程序是我们宿舍共同讨论的,但在写的过程中,我们两之间也出现了多多少少的不同的意见。但最后经过我们后面的协商和实践后,我们达成了一致。

通过这次实验,是我跟明白了团队合作的重要性。再编程过程中,我们都发现了我们自己的一些编程方面问题(例如程序中要对输入的数进行判断,以防超出范围)。通过我们解决了我们之间不同的意见后,使我更加明白了与人沟通的重要性。

时间: 2024-08-29 12:23:50

二维数组子数组的最大值之和的相关文章

返回二维数组子数组联通和最大

分析 1,开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0: 2,将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值: 3,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文件中 数组里面有正数有负数 返回联通子数组和最大的值 #include<fstr

二维数组子数组最大和

1.结组成员 周盼超.张晨建 2.实现功能 随机产生一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 3.设计思路 我感觉,这应该是最笨的方法了吧,我们用了用了四个for嵌套.思路很简单:每一行每一行的求最大子数组和即看成n个一维子数组求最大子数组和,记录结果,然后把两行看做一行上下两个数相加,每两行两行求最大子数组和,然后三行,四行,n行. 4.完整代码 package 二维数组; import java.u

用二维数组存一组学生的成绩,输出总成绩的是谁和分数,输出语文第一名是的谁和成绩

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //一组学生的成绩,输出总成绩的是谁和分数,输出语文第一名是的谁和成绩 var score = [ { name: '小明', chinese: 128, math: 127, engl

php中计算二维数组中某一元素之和

[0] => array(5) { ["id"] => string(2) "11" ["name"] => string(5) "1.jpg" ["suffix"] => string(3) "jpg" ["url"] => string(29) "./Uploads/1/5292f55d208e8.jpg" [&q

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

Task 4.5 求二维数组中的最大连通子数组之和

任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和

返回二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 第一种方法:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. 第二种方法:在二维整形数组中,数据可

二维数组联通子数组和最大

思路: 这也是根据同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文