2、软件工程结对开发之求二维数组中连续最大子数组之和
一、题目:
返回一个二维整数数组中最大子数组的和。
二、要求:
输入一个二维整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求: 两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素, (用逗号分开)
每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
三、合作过程与体会
本次试验我们是在上次试验的基础上,还是利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。不过缺陷是这样时间花费比较多,而且我们没有用文件来实现,只是在程序中输入输出。
四、源程序代码
1 #include <iostream.h> 2 int maxSubArray(int **a,int n,int m) 3 { 4 int **p=new int*[n]; 5 int i,j; 6 if(m==0||n==0) 7 return 0; 8 //计算p[i][j] 9 for(i=0;i<n;i++) 10 { 11 p[i]=new int[m]; 12 for(j=0;j<m;j++) 13 { 14 if(i==0) 15 { 16 if(j==0) 17 p[i][j]=a[i][j]; 18 else 19 p[i][j]=p[i][j-1]+a[i][j]; 20 } 21 else 22 { 23 if(j==0) 24 p[i][j]=p[i-1][j]+a[i][j]; 25 else 26 p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j]; 27 } 28 } 29 } 30 //计算二维数组最大子数组的和 31 int temp; 32 int max=a[0][0];//初始化 33 int sum; 34 if(m==1) 35 { 36 for(i=0;i<n;i++) 37 { 38 for(j=i;j<n;j++) 39 { 40 if(i==0) 41 { 42 temp=p[j][m-1]; 43 } 44 else 45 { 46 temp=p[j][m-1]-p[i-1][m-1]; 47 } 48 if(sum<temp) 49 sum=temp; 50 } 51 } 52 } 53 else 54 { 55 for(i=0;i<n;i++) 56 { 57 for(j=i;j<n;j++) 58 { 59 if(i==0) 60 { 61 temp=p[j][m-1]-p[j][m-2]; 62 } 63 else 64 { 65 temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2]; 66 } 67 for(int k=m-2;k>=0;k--) 68 { 69 if(temp<0) 70 temp=0; 71 if(i==0) 72 { 73 if(k==0) 74 temp+=p[j][k]; 75 else 76 temp+=p[j][k]-p[j][k-1]; 77 } 78 else 79 { 80 if(k==0) 81 temp+=p[j][k]-p[i-1][k]; 82 else 83 temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1]; 84 } 85 if(sum<temp) 86 sum=temp; 87 } 88 } 89 } 90 } 91 return sum; 92 } 93 94 int main() 95 { 96 int n;//行数 97 int m;//列数 98 cout<<"请输入二维数组的行数:"<<endl; 99 cin>>n; 100 cout<<"请输入二维数组的列数"<<endl; 101 cin>>m; 102 int i,j; 103 int **a=new int*[n]; 104 cout<<"请输入该二维数组元素:"<<endl; 105 for(i=0;i<n;i++) 106 { 107 a[i]=new int[m]; 108 109 for(j=0;j<m;j++) 110 { 111 cin>>a[i][j]; 112 } 113 } 114 int sum;//最大字数组的和 115 sum=maxSubArray(a,n,m); 116 cout<<"二维数组的最大子数组之和:"<<sum<<endl; 117 return 0; 118 }
五、工作照