一、题目
1、返回一个二维数组中最大子数组的和。
2、要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,数组的列数,每一行的元素, (用逗号分开)每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数
将上述题目的各个结果转换成图形界面显示。
3、结对开发要求:
两人结对完成编程任务。一人主要负责程序分析,代码编程。一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
二、设计思路
比较二维数组中单个元素的最大值;
再比较行相邻两个数相加的最大值;
再比较列相邻两个数相加的最大值;
即以第一行,第一列元素为中心,逐渐向整个矩阵扩展。
最后,比较各个情况最大值,得出最终结果。
三、源代码
1 #include<iostream.h> 2 int max[6]={0};//存储最大值 3 int b[6]={1,1,1,1,1,1};//存储最大值的行坐标 4 int c[6]={1,1,1,1,1,1};//存储最大值的列坐标 5 int a[10][10];//存储文件中的数据 6 int line; 7 int row; 8 int main() 9 { 10 int i,j; 11 int line=2; 12 int row=3; 13 void biggest(); 14 cout<<"请输入数组元素:(两行三列)"<<endl; 15 for(i=0;i<line;i++) 16 { 17 for(j=0;j<row;j++) 18 { 19 cin>>a[i][j]; 20 } 21 } 22 cout<<"数组元素为:"<<endl; 23 for(i=0;i<line;i++) 24 { 25 for(j=0;j<row;j++) 26 { 27 cout<<a[i][j]<<" "; 28 } 29 cout<<endl; 30 } 31 biggest(); 32 return 0; 33 } 34 void biggest()//算出最大值 35 { 36 int i,j; 37 int k=0; 38 int Max; 39 max[0]=a[0][0]; 40 for(i=1;i<line;i++) 41 { 42 for(j=0;j<row;j++) 43 { 44 if(max[0]<a[i][j]) 45 { 46 max[0]=a[i][j]; 47 b[0]=i+1; 48 c[0]=j+1; 49 } 50 } 51 } 52 max[1]=a[0][0]+a[0][1]; 53 for(i=0;i<line;i++) 54 { 55 for(j=0;j+1<row;j++) 56 { 57 if(max[1]<(a[i][j]+a[i][j+1])) 58 { 59 max[1]=a[i][j]+a[i][j+1]; 60 b[1]=i+1; 61 c[1]=j+1; 62 } 63 } 64 } 65 max[2]=a[0][0]+a[1][0]; 66 for(j=0;j<row;j++) 67 { 68 for(i=0;i+1<line;i++) 69 { 70 if(max[2]<(a[i][j]+a[i+1][j])) 71 { 72 max[2]=a[i][j]+a[i+1][j]; 73 b[2]=i+1; 74 c[2]=j+1; 75 } 76 } 77 } 78 max[3]=a[0][0]+a[0][1]+a[0][2]; 79 for(i=0;i<line;i++) 80 { 81 for(j=0;j+2<row;j++) 82 { 83 if(max[3]<(a[i][j]+a[i][j+1]+a[i][j+2])) 84 { 85 max[3]=a[i][j]+a[i][j+1]+a[i][j+2]; 86 b[3]=i+1; 87 c[3]=j+1; 88 } 89 } 90 } 91 max[4]=a[0][0]+a[0][1]+a[1][0]+a[1][1]; 92 for(i=0;i+1<line;i++) 93 { 94 for(j=0;j+1<row;j++) 95 { 96 if(max[4]<(a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1])) 97 { 98 max[4]=a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1]; 99 b[4]=i+1; 100 c[4]=i+1; 101 } 102 } 103 } 104 max[5]=a[0][0]+a[0][1]+a[0][2]+a[1][0]+a[1][1]+a[1][2]; 105 b[5]=1; 106 c[5]=1; 107 Max=max[0]; 108 for(i=0;i<6;i++) 109 { 110 if(Max<max[i]) 111 { 112 Max=max[i]; 113 k=i; 114 } 115 } 116 cout<<"最大值为"<<Max<<endl; 117 118 }
四、运行结果
五、心得体会
我和同伴看到这道题目的时候,没有思路。后来听了别的同学关于这道题的想法后,才有了些许新想法。
感觉这道题目跟以往的相比,有难度。我和小伙伴,在我们力所能及的范围内做这道题。通过这道题目,感
觉自己在平时的练习中,有所欠缺,对于编程的能力还需要提高。在以后的练习中,应该多动手,争取可以
不断简化自己程序中的算法。当然,在我和同伴一起的努力下,我们完成了题目,自己也得到了锻炼。
(附图)