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

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱)

成员

陈晨:负责代码复审和代码测试计划

王颖瑞:负责程序分析,代码编程

思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组。之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值。

代码

#include<iostream>
using namespace std;
void main ()
{
	int x,y,i,j,m=0,n,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];
			A[i][j+y]=A[i][j];
		}

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

				}
				max=0;
				for(j=n;j<y+n;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=n;j<y+n;j++)
			{
				sum[j]=0;
			}

		}
		n++;

	}
	cout<<result<<" ";

	}

  截图

总结:这次作业主要是对之前的两次实验进行结合,而且在他们结合的基础上,进行优化。通过这次实验,我们之间更加默契,也积累了不少的经验。

时间: 2024-12-23 04:01:01

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

求子数组之和最大值

求子数组之和最大值 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 让自己爆发吧,不要在安于现状了. 题目 求子数组之和最大值. 方案 我的算法执行如下,C++表示如下(

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

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

二维数组求最大值

设计思想:      首先要用一段代码,可以读入txt文件里的二维数组.需要将txt文件放入同一目录.       其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法.思路如下: 1.得到子数组的最大行.列数,从第一行开始,确定最大子数组的行列范围. 2.将确定的范围,把最大子数组按照一列有几个数,按行分开成.(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致) 3,对2中得到的数组,利用一维数组求子

编程之美之2.14 求数组的子数组之和的最大值

[题目] 一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 该子数组是连续的. 我们先来明确一下题意: (1)子数组意味着是连续的. (2)题目只需要求和,并不需要返回子数组的具体位置. (3)数组的元素是整数,所以数组可能包含正整数,负整数或者零. 举几个例子: 数组:[1,-2,3,5,-3,2]返回8 数组:[0,-2,3,5,-1,2]返回9 数组:[-9,-2,-3,-5,-3]返回8 [解法一

2.14 求数组的子数组之和的最大值

题目:给定一个一维数组,求这个数组的子数组之和的最大值. 最佳方法:动态规划! 一. 可以将一个大问题(N个元素数组)转化为一个较小的问题(N-1个元素数组).. 假设已经知道(A[1],...A[n-1])中最大的子数组的和为:All[1] 并且已经知道(A[1],...A[n-1])中包括A[1]的子数组的最大和为start[1] 所以最终的解All[0] = max(A[0], A[0]+start[1], All[1]) 所以通过DP来求解! 代码如下: #include <iostre

第2章 数字之魅——求数组的子数组之和的最大值

求数组的子数组之和的最大值 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter2shuzizhimei.maxsumsubarray; 2 /** 3 * 求数组的子数组之和的最大值 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class MaxSumSubArray1 { 9 //求数组的子数组之和的最大值 10 public static double maxSum(double a[]){ 11 double

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].

求数组的子数组之和的最大值?

自己写的代码考虑未周全,引入了额外的空间复杂度: //求数组的子数组之和的最大值 #include <iostream> #define N 12 using namespace std; int main() { //int a[]={-5,2,3,-3,-2,3,1,-5}; //int a[]={-5,2,0,3,-2,3,4,5}; int a[]={1,-2,3,10,-4,7,2,-5}; int flag,max,i,j=0; int sum[N]={0}; //(1)记录子数组

[编程之美] 2.14 求数组的子数组之和的最大值

问题描述:给定一个包含N个整数的数组,求数组的子数组之和的最大值. 这是递归和贪心策略的一个经典问题.现在,对这个问题进行一下总结. 1 明确题意 题目中的子数组要求是连续的,也就是数组中的某个连续部分. 如果数组中都是正整数,直接相加就行.因此,主要是要考虑负数的情况. 2 直接求所有的子数组和 最简单且容易理解的解法是求出所有的子数组和,然后保存最大的和. int MaxSum(int *A, int n) { int maximum = -INF; int sum = 0; int i =