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

一、题目要求

输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和

二、解题思路

这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果。

三、程序代码

  1 #include "stdafx.h"
  2 #include<iostream.h>
  3 int main(int argc, char* argv[])
  4 {
  5     int i,j;
  6     int a[3][5]={{1,-2,3},{1,-3,2},{4,-4,5}};
  7     int b[3][5];
  8     for(i=0;i<3;i++)
  9     {
 10      for(j=0;j<2;j++)
 11         a[i][j+3]=a[i][j];
 12     }
 13     int max=a[0][0];
 14     cout<<"初始二维数组为:"<<endl;
 15     for(i=0;i<3;i++)
 16     {
 17         for(j=0;j<3;j++)
 18         {
 19             cout<<a[i][j]<<‘ ‘;
 20         }
 21         cout<<endl;
 22     }
 23     cout<<"重构后环形数组为:"<<endl;
 24     for(i=0;i<3;i++)
 25     {
 26         for(j=0;j<5;j++)
 27         {
 28             cout<<a[i][j]<<‘ ‘;
 29         }
 30         cout<<endl;
 31     }
 32
 33
 34     for(i=0;i<1;i++)
 35     {
 36         b[0][0]=a[0][0];
 37         for(j=0;j<5;j++)
 38         {
 39             if(a[0][j-1]<0)
 40             {
 41                 b[0][j]=a[0][j];
 42             }
 43             else
 44             {
 45                 b[0][j]=b[0][j-1]+a[0][j];
 46             }
 47         }
 48     }
 49     for(i=1;i<3;i++)
 50     {
 51         for(j=0;j<1;j++)
 52         {
 53             if(a[i-1][0]<0)
 54             {
 55                 b[i][0]=a[i][0];
 56             }
 57             else
 58             {
 59                 b[i][0]=b[i-1][0]+a[i][0];
 60             }
 61         }
 62     }
 63     for(i=1;i<3;i++)
 64     {
 65         for(j=1;j<5;j++)
 66         {
 67             if(b[i-1][j-1]<0)
 68             {
 69                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
 70                 {
 71                     if(b[i][j-1]>=b[i-1][j])
 72                     {
 73                         b[i][j]=b[i][j-1]+a[i][j];
 74                     }
 75                     else
 76                     {
 77                         b[i][j]=b[i-1][j]+a[i][j];
 78                     }
 79                 }
 80                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
 81                 {
 82                     b[i][j]=b[i-1][j]+a[i][j];
 83                 }
 84                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
 85                 {
 86                     b[i][j]=b[i][j-1]+a[i][j];
 87                 }
 88                 else
 89                 {
 90                     b[i][j]=a[i][j];
 91                 }
 92             }
 93             else
 94             {
 95                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
 96                 {
 97                     b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
 98                 }
 99                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
100                 {
101                     b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
102                 }
103                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
104                 {
105                     b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
106                 }
107                 else
108                 {
109                     b[i][j]=a[i][j];
110                 }
111             }
112         }
113     }
114     cout<<"子矩阵的和数组为:"<<endl;
115     for(i=0;i<3;i++)
116     {
117         for(j=0;j<5;j++)
118         {
119             cout<<b[i][j]<<" ";
120         }
121         cout<<endl;
122     }
123     cout<<endl;
124     for(i=0;i<3;i++)
125     {
126         for(j=0;j<5;j++)
127         {
128             if(b[i][j]>max)
129                 max=b[i][j];
130         }
131     }
132     cout<<"最大子矩阵和为:"<<max<<endl;
133     return 0;
134
135 }

四、结果截图

五、心得体会

  这次的合作我们俩个的角色互换了,陆宇为驾驶员,我做了领航员,这次的题目,是前面两个题目的组合,求二维数组最大子矩阵的和,求环形一维数组的最大子数组的和,环形一维时,我们采用了跨越首尾和不跨越首尾两种情况,发现这种方法不适用于二维,所以采用了重构数组的方法,转化成非环形,然后求二维最大子数组的和。开始在循环条件那儿遇到了问题,后来我们两个一起解决了,这次合作让我体会到了搭档的重要性,总之,这次结对开发很成功,以后继续努力。

时间: 2024-08-08 01:54:53

结对开发——求环形二维数组最大子矩阵和的问题的相关文章

结对开发-求环状二维数组最大子数组

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

软件工程课堂训练——结对开发之环状二维数组

一.题目及要求: 题目:返回一个整数数组中最大子数组的和 要求(新加):①输入一个二维整形数组,数组里有正数也有负数:②二维数组首尾相接,像一条首尾相接的带子一样. 结对人员:胡亚宝  焦燕 二.设计思路: 这个题目其实就是二维数组和环型数组的结合,要解决这个问题,将之前的两个问题融合一下即可. 首先解决求出二维数组中最大子数组的问题,然后沿用一维数组的方法,将第一列放到最后一列,在求出新的二维数组的最大子数组,依次求出各个二维数组的最大子数组. 三.部分源代码: 1 for (m=0;m<5;

结对开发5_循环二维数组最大字数组

一.思想 我们这次的思想和一维数组的思想一样,但是考虑到是二维的,所以其算法和结对开发3的算法一样.即加长数组的列数 加以控制条件,最后求出最大子数组的和,并输出. 二.源代码 // 结对开发5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" # include <iostream> # include <string> # define MaxRow 20 # define MaxCol 20 using namespa

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

设计思路: 因为之前做过二维数组的和环形一维数组的,所以第一感觉就是能不能把这两种整改一下结合起来,所以采用的做法就是将二维环形变化为一维环形,在此采用的方法是从第一行开始,第一行计算出最大子数组,然后第一行和第二行相加为一维计算最大子数组,然后第一行.第二行和第三行,以此类推,最后将各子数组的最大值进行比较,得到最大的即为子数组和的最大值. 实验代码: //环形一维数组求最大子数组 package erwei; public class oneArray { private int i; pu

求首位相连二维数组最大子矩阵的和

结对成员:侯涛亮:主要负责程序设计编写代码. 朱少辉:主要负责程序调试和修改. 题目:一个首尾相接的二维数组,其中有有正数,有负数,求它的最大子矩阵. 思路:该题的解决方法是求二维数组最大子矩阵的和与求一维首位相连最大子数组和结合.求解环的最大子数组可分为两种情况.第一种:当数组下标没有越界,.第二种情况是数组越界. 代码: #include<iostream> using namespace std; int MAX(int s[],int n) { int i,sum=0,max=s[0]

求一个二维数组的最大子数组

小组成员:周其范  胡宝月 上课的时候老师布置的题目是求一个二维数组的最大子数组,因为以前的时候老师要求我们做过一个题目就是求一个数组的最大子数组,当时的方法就是利用循环把所有可能算出,然后比较那个最大就是那个,也就是所说的枚举法.因此这次我们同样的想到了枚举法.但当我们讨论的时候发现了二维有些麻烦,所以我俩在想有没有什么别的方法,最后我们想到了其实二维数组和一位数组有相似之处,可以先把二维数组变成一维数组在算. 对于imin和imax之间的的每一列,都相当于一个一维的元素,假设数组是BC,那么

环形二维数组求最大子矩阵

1.设计思路 结合环一位数组的开发经验,拓展到二维.与前者主要是时间复杂度没有做处理. 2.源代码 1 //作者:王炳午.董龙洋.日期:2015.3.24. 2 #include <iostream> 3 #include<stdlib.h> 4 #include<time.h> 5 using namespace std; 6 int maxMax(int amax[]) //求最大 7 { 8 int i; 9 int sum = 0; 10 int max; 11

《团队开发项目之三二维数组的最大子数组之和》

设计思想:按列或按行的次序依次进行计算每个以列或行的次序为基准的每种情况下的每个子矩阵的和,然后再依次进行比较每个子矩阵的和,取出最大的一个即是最大字数组之和: 源代码: //二维数组的最大子数组之和 //李敏,Apr 8th #include<iostream> #include<time.h> using namespace std; void main() { int m,n,a[100][100],k,t,c,i,j,z; int maxsum,sum[100],max=0

环形二维数组

一.题目 输出二维环形数组中最大子数组和 二.设计思想 把解决一维环形数组,和普通二维数组的方法结合起来街是解决二维环形数组的方法. 三.源代码 #include<iostream.h> #include<time.h> #include<stdlib.h> int qiumax(int arry[],int max) { int i; long sum; for(i=0;i<5;i++) { for(i=0;i<5;i++) { arry[i+5]=arr