合作项目5

结组成员:信1201-1柴珏辉 信1201-2邓锐

一、要求

1、题目:

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

2、要求:

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

二、设计思路

整体思路与上一篇首尾相连的一维数组求最大子数组的相同,在求二维数组的最大子数组程序上进行了修改,重复输入一遍数组实现环状,在行列上分别遍历,限制首尾两个位置不超过一个整体数组。

三、程序代码

复制代码
 1 #include<iostream.h>
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<time.h>
 5 #define N 6   //行数
 6 #define M 10  //列数
 7 void qiuhe(int a[N][M*2],int &he,int i,int j,int k,int l) //求两个顶点数所确定的矩阵之和,[i,j]为第一个数的下标,[k,l]为第二个数的下标
 8 {
 9     int c,b;
10     he=0;
11     for(c=i;c<=k;c++)
12     {
13         for(b=j;b<=l;b++)
14         {
15             he=he+a[c][b];
16         }
17     }
18 }
19 void display(int a[N][M*2],int i,int j,int k,int l)  //输出两个顶点数所确定的矩阵,[i,j]为第一个数的下标,[k,l]为第二个数的下标
20 {
21     int b,c;
22     for(c=i;c<=k;c++)
23     {
24         for(b=j;b<=l;b++)
25         {
26             cout<<a[c][b]<<" ";
27         }
28         cout<<endl;
29     }
30 }
31  void main()
32  {
33      int a[N][M*2];
34      srand((unsigned)time(NULL));
35      int i,j,k,l,hang1=0,hang2=0,lie1=0,lie2=0,max=a[0][0],he=0;
36      for(i=0;i<N;i++)         //对二维数组中的数随机生成
37      {
38          for(j=0;j<M;j++)
39          {
40              a[i][j]=rand()%20-9;
41              a[i][j+M]=a[i][j];   //横向重复输出一遍数组,实现首尾相连
42          }
43      }
44      for(i=0;i<N;i++)
45      {
46          for(j=0;j<M;j++)           //前两个循环遍历第一个顶点数
47          {
48              for(k=i;k<N;k++)
49              {
50                  for(l=j;l<M+j;l++)    //后两个循环遍历第二个顶点数
51                  {
52                      qiuhe(a,he,i,j,k,l);
53                      if(he>max)
54                      {
55                          max=he;
56                          hang1=i;
57                          hang2=k;
58                          lie1=j;
59                          lie2=l;
60                      }
61                  }
62              }
63          }
64      }
65      cout<<"原数组:"<<endl;
66      display(a,0,0,N-1,M-1);
67      cout<<"最大子数组(两个顶点坐标("<<hang1+1<<","<<lie1+1<<")"<<"("<<hang2+1<<",";
68      if(lie2>M)
69      {
70         cout<<lie2+1-M<<"))"<<endl;
71      }
72      else
73      {
74          cout<<lie2+1<<"))"<<endl;
75      }
76      display(a,hang1,lie1,hang2,lie2);
77      cout<<"和为:"<<max<<endl;
78  }
复制代码

 截图:

合作项目5_第1张图片

 四、测试

1.数组元素数量

N=600

M=1000

数据过大不能实现……

 2.数据大小

 a[i][j]=(rand()%20000)-10000 

合作项目5_第2张图片

五、心得体会

这次的题目是在我们合作项目2基础上修改的,基本思想与上一次题目的一样,实现起来没有用太多时间,但在算法复杂度上还需要改进。

结组成员照片:

合作项目5_第3张图片

你可能感兴趣的:(项目)