一、实验要求
1、输入一个二维整形数组,数组里有正数也有负数。
2、二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)。
4、两人结对完成编程任务。
5、一人主要负责程序分析,代码编程。
6、一人负责代码复审和代码测试计划。
7、发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
二、设计思路
首先利用随机数生成一个二维数组,可以控制生成随机数的范围,利用宏定义控制二维数组的大小,几行几列就可以随心变换了。采取逐行轮换相加的方法依次求若干行的最大子数组的和,利用一个一
维数组来储存逐行轮换相加得到的一堆数组,在在该数组里求一维数组的最大子数组的和,这样就把返回一个二维整数数组中最大子数组的和转换成返回一个一维整数数组中最大子数组的和。
三、源程序代码
#include <stdlib.h> #include<iostream> #include <cstdlib> #include <ctime> using namespace std; #define M 5 #define N 6 void main() { int m=5,n=6,a[100][100],i,j,b,c,z; cout<<"请输入数值范围:"<<endl; cin>>b>>c; cout<<"生成二维数组为:"<<endl; srand(unsigned(time(0))); for(i=0;i<M;i++) { for(j=0;j<N;j++) { a[i][j]=rand()%(c-b+1)+b; cout<<a[i][j]<<" "; } cout<<endl; } int sum,s[100],k=0,e=-1000,f=-1000,g=-1000; for(j=0;j<N;j++) { s[j]=0; } for(int ii=0;ii<M;ii++) { while(k+ii<M) { for(j=0;j<N;j++) { s[j]=s[j]+a[k+ii][j]; } for (i=0;i<N;i++) { for (j=i;j<N;j++) { sum=0; for (z=i;z<=j;z++) { sum=sum+s[z]; } if (sum>e) e=sum; } if (e>f) { f=e; } } k++; } if (f>g) { g=f; } k=0; for(j=0;j<N;j++) { s[j]=0; } } cout<<"子矩阵最大值为"<<f<<endl; system("pause"); }
四、运行截图
五、遇到的困难,解决方法及体会
1、一开始没有思路,不知道该怎末弄
解决方法:百度查询,理解人家的思路
体会:借鉴前人经验,理解思路,查阅资料了解了之前不时很了解的宏定义。
六、工作照