结对开发Ⅵ——循环二维数组求和最大的子数组

一.题目及要求

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

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

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

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

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

二.设计思路

  (1)二维数组我们采用的还是数组的形式;

(2)读取nxm的二维数组,储存成nx2m,把前m列重复加在二维数组的最后;

  (3)搜索最大数组的方法和不循环的二维数组是一样的,就是再加上判断条件加以限制。

三、源代码

 1 // 二维数组循环.cpp : Defines the entry point for the console application.
 2 //
 3
 4 #include "stdafx.h"
 5 #include "fstream.h"
 6 #include "iostream.h"
 7 #define MAXSIZE 50
 8
 9 //*****读取数组信息*****
10 void ReadArr(int arr[][MAXSIZE],int &len1,int &len2)
11 {
12     ifstream infile("Arr.txt");
13     if(!infile)
14         cout<<"读取失败!"<<endl;
15     else
16     {
17         infile>>len1>>len2;
18         for(int i=0;i<len1;i++)
19         {
20             for(int j=0;j<len2;j++)
21             {
22                 infile>>arr[i][j];              //从文件中读取数据
23                 arr[i][j+len2]=arr[i][j];
24             }
25         }
26     }
27
28 }
29 //*****显示矩阵*****
30 void ShowArr(int arr[][MAXSIZE],int len1,int len2,int size1,int size2)
31 {
32     for(int i=len1;i<=size1;i++)                //将文件中的数组输出
33     {
34         for(int j=len2;j<=size2;j++)
35         {
36             cout<<arr[i][j]<<"\t";
37         }
38         cout<<endl;
39     }
40 }
41 //*****求和公式*****
42 int GetSum(int arr[][MAXSIZE],int len1,int len2,int size1,int size2)
43 {
44     int sum=0;
45     for(int i=len1;i<=size1;i++)              //求任意数组中两个数之间的数的和
46     {
47         for(int j=len2;j<=size2;j++)
48         {
49             sum+=arr[i][j];
50         }
51     }
52     return sum;
53 }
54
55 int main(int argc, char* argv[])
56 {
57     int len1,len2,max,sum;                        //len1是行数,len2是列数
58     int line1,line2,row1,row2;                    //和最大的矩阵的两个坐标
59     int arr[MAXSIZE][MAXSIZE];
60     ReadArr(arr,len1,len2);
61     cout<<"矩阵:"<<endl;
62     ShowArr(arr,0,0,len1-1,len2-1);
63     cout<<endl;
64     line1=0;
65     line2=0;
66     row1=0;
67     row2=0;
68     sum=0;
69     max=arr[0][0];
70     for(int i=0;i<len1;i++)                        //第一个数的行数
71     {
72         for(int j=0;j<len2;j++)                    //第一个数的列数
73         {
74             for(int m=i;m<len1;m++)                //第二个数的行数
75             {
76                 for(int n=j;(n<2*len2)&&(n<j+3);n++)
77                 {                                  //第二个数的列数
78                     sum=GetSum(arr,i,j,m,n);       //求出这两个数构成的矩阵的和
79                     if(sum>max)
80                     {
81                         max=sum;
82                         line1=i;                   //保存第一个数的行
83                         line2=m;                   //保存第二个数的行
84                         row1=j;                    //保存第一个数的列
85                         row2=n;                    //保存第二个数的列
86                     }
87                 }
88             }
89         }
90     }
91     cout<<"和最大的子矩阵:"<<endl;
92     ShowArr(arr,line1,row1,line2,row2);
93     cout<<"最大的和:"<<max<<endl;
94     return 0;
95 }

四、运行截图

五、心得体会

这次的拓展我们很快就实现了,是因为写二维数组的时候,我们的思路比较清晰,函数功能比较专一规范,所以在拓展的时候比较容易。思路上我们采用了上次一维循环数组别的同学的想法,就是在每行数组的末尾再写一遍该行数据,遍历时加上长度的限制条件就可以了。

这次的拓展和上次的形成了较强的对比,还是好的算法清晰的思路比较好。因为上次我们的一维数组算法写的不太好,所以导致我们在后面的拓展中不得不重写。

六、无图无真相

时间: 2024-10-07 15:03:16

结对开发Ⅵ——循环二维数组求和最大的子数组的相关文章

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

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

3月31号周二课堂练习:结对开发----求二维数组组成的矩阵中子矩阵的最大值二

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

结对开发Ⅴ——循环一维数组求和最大的子数组

一.设计思路 (1)数据的存储结构是链表,最后一个结点的next指向第一个元素的结点: (2)数据个数为n,则最多有n*(n+(n-1)+...+1)种情况(包括重复): (3)剩下的部分与二维数组的差不多. 二.源代码 1 // 一维数组.cpp : Defines the entry point for the console application. 2 // 袁佩佩 于海洋 3 4 #include "stdafx.h" 5 #include<iostream.h>

结对开发——求二维环形数组所有子矩阵最大和的问题

一.题目要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.解决思路: 由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果.

蓝鸥Unity开发基础—— 二维数组学习笔记

蓝鸥Unity开发基础-- 二维数组学习笔记 一.二维数组 有两个下标的数组叫做二维数组 类似[,]数组名=new类型[常量表达式1,常量表达式2] int[,] numbers= new int[2,3]; [0,0] [0,1] [0,2] [1,0] [1,1] [1,2] 举例说明 using System; namespace Lesson16{    class MainClass    {        public static void Main (string[] args)

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的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)中的元素:"

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据开发03

大家好,这次是第三个课时的视频,欢迎大家继续学习. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地址:http://www

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据系统02

hello,上一次我们上传了第一个课时的视频,现在当然是上传第二个视频咯. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地

用reduce装逼 之 多个数组中得出公共子数组,统计数组元素出现次数

昨天做了一道美团的面试题,要求是给N个数组,找出N个数组的公共子数组. var a = [7,2,3,4,5]; var b = [4,2,3,7,6]; var c = [2,3,3,3,7]; var d = [4,2,3,8,7]; 以上四个数组,有公共子数组2, 3,7 function main(){ var result = []; var arr = arguments[0]; for(var i=1 ; i<arguments.length ; i++){ var arr = a