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

一、实验题目

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

实验要求:

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

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

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

求所有子数组的和的最大值。要求时间复杂度为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比较大小。同理求第二、三列。即可得出最大的来。

三、源程序

 1 //信1201-2班 司新红 万彤
 2 #include "stdafx.h"
 3 #include "iostream"
 4 using namespace std;
 5 int main()
 6 {
 7     int hang,lie;
 8     int a;
 9     int i,j;
10     int s;//    求和
11     int count;
12     int max;
13     cout<<"请输入二维数组的行数:";
14     cin>>hang;
15     cout<<"请输入二维数组的列数:";
16     cin>>lie;
17     int **A;//定义动态二维数组
18     int **B;
19     a=lie*lie;
20     A=new int*[hang];
21     for(int k=0;k<hang;k++)
22     {
23         A[k]=new int[lie];
24     }
25     B=new int*[hang];
26     for(int l=0;l<hang;l++)
27     {
28         B[l]=new int[a];
29     }
30
31     /*数组初始化*/
32
33     cout<<"请输入二维数组中的元素"<<endl;
34     for(int i=0;i<hang;i++)
35     {
36         for(int j=0;j<lie;j++)
37         {
38             cin>>A[i][j];
39         }
40     }
41
42
43     /*二维数组压缩函数*/
44
45
46     for(i=0;i<hang;i++)
47     {
48         count=0;
49         for(j=0;j<lie;j++)
50         {
51             s=0;
52             for(int l=0;l<lie;l++)                            //每一行按顺序进行枚举存入数组中
53             {
54                 s=s+A[i][l+j];
55                 B[i][count+l]=s;
56             }
57             count=count+lie;
58             A[i][lie+j]=A[i][j];
59         }
60     }
61
62
63     max=B[0][0];                                                //将数组的第一个数赋值给max
64     for(j=0;j<a;j++)
65     {
66         for(i=0;i<hang;i++)
67         {
68             s=0;
69             for(int r=0;r<hang-i;r++)
70             {
71                 s=s+B[r+i][j];                            //逐列对数组进行枚举,求最大值
72                 if(max<s)
73                 {
74                     max=s;
75                 }
76             }
77         }
78     }
79     cout<<"最大子数组之和为:"<<max<<endl;
80     return 0;
81 }

四、实验截图

五、心得体会

之前我们的数组都是采用的固定长度,但是这次我和小伙伴有了一个突破,就是手动输入行和列,其实我感觉这还是一个挺大的突破的(有一点点的小骄傲吧)。虽然在编程的过程中也遇到了一定的困难,但是我们都克服了,我感觉这就是进步。思想虽然还是原来的思想,但是在编写的过程中还是有一定的难度的。通过编写这次的程序我又增加了自信。

时间: 2024-10-18 21:48:28

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

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

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

一维数组求最大子数组(解决溢出问题)

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 程序在宏里面定义出了数组长度的大小,在长度超过100万的时候程序直接崩溃,其实这并不是因为结果太大导致的数值溢出,而是因为内存溢出,我们的数组是定义在程序内部的,属于局部变量,存放位置在栈上

环形数组求最大子数组之和

环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一种为数组中存在正数情况,一种为全部为负数的情况: 在存在正数的情况中又可分为三种情况,一种为全部为正数的情况,一种为自设的头元素为正数,最后一种为自设的头元素为负数.根据这几种情况分类进行实现. 在实现过程中,对数组元素从头到尾进行遍历,如果遇到正数即用和相加,直到相邻的下一个为负数,即存放目前该最

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat

结对开发之二维环数组求最大子数组的和4

结对成员:信1201-1班    黄亚萍 信1201-1班    袁亚姣 一.题目要求 要求:            输入一个二维整形数组,数组里有正数也有负数.            二维数组首尾相接,象个一条首尾相接带子一样.            数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.            求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.设计思路 类似于3,将二维数组转化为一维数组来求最大子数组

整数数组求最大子数组和

一.实验题目 返回一个整数数组中最大子数组的和. 二.实验要求 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 三.设计思想 该实验大部分可以分为两部分: 1.利用while循环录入输入的数组值,输入值为string类型,利用Integer.parseInt(String a),存入int数组,如果是"#"则结束录入 2.调用求最大值函数和的最大值,分

结对开发,首位相邻的数组求最大子数组

结对人员:张世通 梁世豪 一.题目 返回一维数组中最大子数组的和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 要求时间复杂度为O(n) 二.设计思路 1.在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法 2.通过定义变量start,fin

循环数组求最大子数组

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 把数组每一位向后移动一位,最后一位放在第一位.循环多次,每次求其最大子数组,存放到新数组内,比较新数组中最大数,