题目:在原有的一位数组上进行扩展,求二位数组的最大子数组的和:
题目:返回一个二维整数数组中最大子数组的和。
要求: 输入一个二维整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
结对开发过程:
这次的编程开发是基于上次的以为数组,我和我的搭档@天使RL恶魔开始了认真的讨论,再结合课堂上的同学讨论,如何能将二维数组转化为一位数组,降低时间复杂度,这种方法的特殊边界要考虑,首先求出p[i][j],表示以(0,0)为起点,以(i,j)为终点的的连续子数组的和,起点是第a行,终点是第c行,然后转换为一维连续子数组的和;首先应该找出p[i][j],具体代码如下:
参考代码:
1 #include <iostream> 2 using namespace std; 3 4 int maxSubArray(int **a,int n,int m) 5 { 6 int **p=new int*[n]; 7 int i,j; 8 if(m==0||n==0) 9 return 0; 10 //计算p[i][j] 11 for(i=0;i<n;i++) 12 { 13 p[i]=new int[m]; 14 for(j=0;j<m;j++) 15 { 16 if(i==0) 17 { 18 if(j==0) 19 p[i][j]=a[i][j]; 20 else 21 p[i][j]=p[i][j-1]+a[i][j]; 22 } 23 else 24 { 25 if(j==0) 26 p[i][j]=p[i-1][j]+a[i][j]; 27 else 28 p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j]; 29 } 30 } 31 } 32 //计算二维数组最大子数组的和 33 int temp; 34 int max=a[0][0]; 35 int ans; 36 //如果m==1 37 if(m==1) 38 { 39 for(i=0;i<n;i++) 40 { 41 for(j=i;j<n;j++) 42 { 43 if(i==0) 44 { 45 temp=p[j][m-1]; 46 } 47 else 48 { 49 temp=p[j][m-1]-p[i-1][m-1]; 50 } 51 if(ans<temp) 52 ans=temp; 53 } 54 } 55 } 56 else 57 { 58 for(i=0;i<n;i++) 59 { 60 for(j=i;j<n;j++) 61 { 62 if(i==0) 63 { 64 temp=p[j][m-1]-p[j][m-2]; 65 } 66 else 67 { 68 temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2]; 69 } 70 for(int k=m-2;k>=0;k--) 71 { 72 if(temp<0) 73 temp=0; 74 if(i==0) 75 { 76 if(k==0) 77 temp+=p[j][k]; 78 else 79 temp+=p[j][k]-p[j][k-1]; 80 } 81 else 82 { 83 if(k==0) 84 temp+=p[j][k]-p[i-1][k]; 85 else 86 temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1]; 87 } 88 if(ans<temp) 89 ans=temp; 90 } 91 } 92 } 93 } 94 return ans; 95 } 96 97 int main() 98 { 99 int n,m; 100 printf("请输入二维数组的行数和列数: "); 101 scanf("%d %d",&n,&m); 102 int i,j; 103 int **a=new int*[n]; 104 printf("请输入%d*%d个二维数组元素: ",n,m); 105 for(i=0;i<n;i++) 106 { 107 a[i]=new int[m]; 108 109 for(j=0;j<m;j++) 110 { 111 scanf("%d",&a[i][j]); 112 } 113 } 114 int ans=maxSubArray(a,n,m); 115 printf("二维数组的最大子数组之和是:%d ",ans); 116 return 0; 117 }
程序结果测试:
实验结束的感想:
当时看到的时候,感觉应该不是很难,但是想了半天也想不出来,直到老师让同学去讲台讲了他们的想法,才给了我们一点启发,然后再课下找到了一点资料,最后才勉强在别人的基础上有了一点结果,才明白什么事都不能想当然。
附美照一张: