一、题目要求
题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
这次的题目设计思路沿用的是上次一位数组的设计思想,把二维数组中的每一行看作是一位数组,然后做出扩展,程序依然用的是二维数组的那个,在这个基础上做出稍稍改变就行了
三、源代码
1 //程序开发者:曹美娜 盖相庚 2 // 开发时间:2015/3/31 3 4 #include "stdafx.h" 5 #include "fstream.h" 6 #include "iostream.h" 7 #include "stdio.h" 8 #define N 50 9 #define M 50 10 11 void readarry(int arry[][N],int &line,int &row) //读取txt文件中的二维数组 12 { 13 ifstream infile("a.txt"); 14 if(!infile) 15 cout<<"读取失败!"<<endl; 16 else 17 { 18 infile>>line>>row; 19 for(int i=0;i<line;i++) 20 { 21 for(int j=0;j<row;j++) 22 { 23 infile>>arry[i][j]; 24 } 25 } 26 } 27 } 28 29 int maxarry(int arry[][N],int line,int row) //找到二维数组中子矩阵中元素和的最大值 30 { 31 int max[N]; 32 printf("以上数组经变形后: "); 33 for(int l=0;l<line;l++) 34 { 35 int max1=-1000; 36 for(int j=0;j<(row+1)/2;j++) 37 { 38 int sum=0; 39 for(int i=j;i<(row+1)/2;i++) 40 { 41 sum=sum+arry[l][i]; 42 if(sum>=max1) 43 { 44 max1=sum; 45 } 46 } 47 48 } 49 max[l]=max1; 50 51 printf("第%d集合所有子数组的和的最大值为:%d ",l+1,max1); 52 } 53 int fmax=max[0]; 54 for(int q=0;q<line;q++) 55 { 56 if(max[q]>fmax) 57 fmax=max[q]; 58 } 59 printf("所以次二位数字中子数组中各元素的和的最大值为:%d ",fmax); 60 61 return 0; 62 } 63 64 void reacharry(int arry[][N],int line,int row) //组成一个新数组 65 { 66 int sumarry[M][N]; 67 int sumline,sumrow; 68 int z; 69 for(int r=0;r<row;r++) 70 { 71 z=0; 72 for(int i=0;i<line;i++) 73 { 74 for(int q=line;q>0;q--) 75 { 76 int sum=0; 77 for(int j=i;j<=line-q+i;j++) 78 { 79 sum=sum+arry[j][r]; 80 } 81 sumarry[z][r]=sum; 82 z++; 83 } 84 } 85 } 86 sumline=z-1; 87 sumrow=r; 88 maxarry(sumarry,sumline,sumrow); //将得到的新数组交给maxsrry(),找到最后结果 89 90 } 91 92 int expand(int arry[][N],int &line,int &row) //对二维数组进行拓展 93 { 94 int arry1[N][N]; 95 for(int i=0;i<line;i++) 96 { 97 for(int j=0;j<row;j++) 98 { 99 arry1[i][j]=arry[i][j]; 100 } 101 } 102 int num=0; 103 for(i=0;i<line;i++) 104 { 105 for(int q=row;q<2*row-1;q++) 106 { 107 arry[i][q]=arry[i][num]; 108 num++; 109 } 110 } 111 reacharry(arry1,line,2*row-1); 112 113 return 0; 114 115 } 116 117 118 119 void show(int arry[][N],int line,int row) //显示数组 120 { 121 printf("从“a.txt”文件中读取的数组为: "); 122 for(int i=0;i<line;i++) 123 { 124 for(int j=0;j<row;j++) 125 { 126 printf(" %d ",arry[i][j]); 127 } 128 printf(" "); 129 } 130 } 131 132 133 134 135 int main(int argc, char* argv[]) 136 { 137 int arry[M][N]; 138 int line,row; //行,列 139 readarry(arry,line,row); 140 show(arry,line,row); 141 expand(arry,line,row); 142 143 return 0; 144 }
四、截图
可能由于我没有讲拓展后的数组输出,所以读者可能看不太出来设计思路,其实设计思路在我上几篇博客中都有提到,这几个的程序设计思路都有所相同
五、心得体会
本次结对开发用时最短,因为是在上一次二维数组上做的拓展,所以思路捋起来很清晰,所以完成的也就快了,这次放假前老师说要要我们小小的放松一下,所以会有一下段时间不会在和我的小伙伴结对编程了,总结一下这几次的结对开发的想法吧,我的小伙伴还是很给力的,只不过是比较自谦,不太信任自己的能力,有时候想东西他也是要比我快的,思维要比我更活跃,希望盖盖同学好好努力,不要太早的为自己盖上标签。
结对开发就是要2个人把自己的想法、热情都交给对方,一开始老师叫我们这样练习的目的大家都认为太形式化,可是几次下来我想大家或多或少都会有自己的收获,都能从对方身上学到些东西,我想大家也会在这段时间里慢慢成长起来。