一、题目:返回一个二维整数数组中最大子数组的和。
项目成员:檀威,陈志利
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求:
两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周四3月26日24:00)
二、设计思想:
首先以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值了,并初始化为max[0][0]。
三、代码:
#include <iostream.h> int maxSubArray(int **a,int n,int m) { int **p=new int*[n]; int i,j; if(m==0||n==0) return 0; //计算p[i][j] for(i=0;i<n;i++) { p[i]=new int[m]; for(j=0;j<m;j++) { if(i==0) { if(j==0) p[i][j]=a[i][j]; else p[i][j]=p[i][j-1]+a[i][j]; } else { if(j==0) p[i][j]=p[i-1][j]+a[i][j]; else p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j]; } } } //计算二维数组最大子数组的和 int temp; int max=a[0][0]; int sum; //如果m==1 if(m==1) { for(i=0;i<n;i++) { for(j=i;j<n;j++) { if(i==0) { temp=p[j][m-1]; } else { temp=p[j][m-1]-p[i-1][m-1]; } if(sum<temp) sum=temp; } } } else { for(i=0;i<n;i++) { for(j=i;j<n;j++) { if(i==0) { temp=p[j][m-1]-p[j][m-2]; } else { temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2]; } for(int k=m-2;k>=0;k--) { if(temp<0) temp=0; if(i==0) { if(k==0) temp+=p[j][k]; else temp+=p[j][k]-p[j][k-1]; } else { if(k==0) temp+=p[j][k]-p[i-1][k]; else temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1]; } if(sum<temp) sum=temp; } } } } return sum; } int main() { int n,m; cout<<"请输入二维数组的行数:"<<endl; cin>>n; cout<<"请输入二维数组的列数"<<endl; cin>>m; int i,j; int **a=new int*[n]; cout<<"请输入该二维数组元素:"<<endl; for(i=0;i<n;i++) { a[i]=new int[m]; for(j=0;j<m;j++) { cin>>a[i][j]; } } int sum=maxSubArray(a,n,m); cout<<"二维数组的最大子数组之和:"<<sum<<endl; return 0; }
四、测试及实验截图
有正有负时测试正确:
全正数时正确:
有正有负有零:
全负数时:
五、缺陷及总结:
本次结对我两在上次用动态法一维数组求最大子数组之和基础上,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和即可,缺陷就是这样时间复杂度比较大,程序也没有相应的错误输入提示,有待改进。
六、工作合照: