结组成员:信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 }
截图:
四、测试
1.数组元素数量
N=600
M=1000
数据过大不能实现……
2.数据大小
a[i][j]=(rand()%20000)-10000
五、心得体会
这次的题目是在我们合作项目2基础上修改的,基本思想与上一次题目的一样,实现起来没有用太多时间,但在算法复杂度上还需要改进。
结组成员照片: