一.题目:
返回一个二维整数数组中最大子数组的和。
二.要求:
输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
三.成员
编写程序者:崔鹏勃
协同者:孔维春
四.编程思路
首先,根据一维数组原理,可以先求出每个行数组的最大子数组和。
然后,将二维3行数组分写成5行子数组的数组,3,4行为1,2和2,3行一起的子数组,5行为,1,2,3行的子数组。
最后,求比较各行最大的子数组和。
1 #include<iostream.h> 2 int main() 3 { 4 int x,y,n,m; 5 int s[10][20]; 6 int sum[10][20]; 7 cout<<"请输入3行4列的矩阵:"<<endl; 8 int a[][4]={10,-20,-1,3,8,10,3,20,-2,4,2,-19} ; 9 for(x=0;x<3;x++) 10 { 11 for(y=0;y<4;y++) 12 { 13 cout<<a[x][y]<<" "; 14 } 15 cout<<endl; 16 } 17 18 //---------------------------以上是数组的输入 19 20 for(x=0;x<3;x++) 21 { 22 for(y=0;y<4;y++) 23 { 24 s[x][y]=a[x][y]; 25 } 26 } 27 28 for(x=0;x<3;x++) 29 { 30 for(y=0;y<3;y++) 31 { 32 s[x][y+4]=a[x][y]; 33 } 34 } 35 36 37 38 for(x=0;x<2;x++) 39 { 40 for(y=0;y<4;y++) 41 { 42 s[x+3][y]=a[x][y]+a[x+1][y]; 43 } 44 } 45 46 47 for(x=0;x<2;x++) 48 { 49 for(y=0;y<3;y++) 50 { 51 s[x+3][y+4]=a[x][y]+a[x+1][y]; 52 } 53 } 54 55 for(y=0;y<4;y++) 56 { 57 s[5][y]=a[0][y]+a[1][y]+a[2][y]; 58 } 59 60 for(y=0;y<4;y++) 61 { 62 s[5][y+4]=a[0][y]+a[1][y]+a[2][y]; 63 } 64 65 66 //--------------------------------------------------- 67 68 69 for(x=0;x<6;x++) 70 { 71 for(y=0;y<7;y++) 72 { 73 sum[x][y]=s[x][y];//0-6 74 } 75 for(y=0;y<6;y++) 76 { 77 sum[x][y+7]=s[x][y]+s[x][y+1];//7-12 78 } 79 for(y=0;y<5;y++) 80 { 81 sum[x][y+13]=s[x][y]+s[x][y+1]+s[x][y+2];//13-17 82 } 83 for(y=0;y<4;y++) 84 { 85 sum[x][y+18]=s[x][y]+s[x][y+1]+s[x][y+2]+s[x][y+3];//18-21 86 } 87 } 88 89 //-------------------------------------------------------------------------//一行有22个数 90 /* 91 for(x=0;x<6;x++) 92 { 93 for(y=0;y<10;y++) 94 { 95 96 97 if(sum[x][y]==30) 98 cout<<x<<endl<<y<<endl; 99 } 100 101 } 102 */ 103 //----------------------------- 104 int max=sum[0][0]; 105 106 for(x=0;x<6;x++) 107 { 108 for(y=0;y<22;y++) 109 { 110 if(sum[x][y]>max) 111 { 112 max=sum[x][y]; 113 n=x; 114 m=y; 115 116 } 117 } 118 119 } 120 //--------------------------------------求最大数 121 122 /* 123 if(n<3) 124 { 125 cout<<"数组开始行:"<<n+1<<endl<<"数组结束行:"<<n+1<<endl; 126 } 127 else 128 { 129 n=n%3; 130 switch(0) 131 { 132 case 0:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+1<<endl;break; 133 case 1:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+1<<endl;break; 134 case 2:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+2<<endl;break; 135 136 } 137 } 138 139 //-----------------------------------------------------------------------------求子数组开始的行 140 if(m<4) 141 { 142 cout<<"数组开始列:"<<m<<endl<<"数组开始列:"<<m<<endl; 143 } 144 else if(m>3&&m<7) 145 { 146 { 147 m=m%4; 148 switch(m) 149 { 150 case 0:cout<<"数组开始列:1"<<endl<<"数组结束列:2"<<endl;break; 151 case 1:cout<<"数组开始列:2"<<endl<<"数组结束列:3"<<endl;break; 152 case 2:cout<<"数组开始列:3"<<endl<<"数组结束列:4"<<endl;break; 153 case 3:cout<<"数组开始列:1"<<endl<<"数组结束列:3"<<endl;break; 154 155 156 157 } 158 } 159 } 160 else if(m>7) 161 { 162 m=m%8; 163 switch(m) 164 { 165 case 0:cout<<"数组的开始列:2"<<endl<<"数组的结束列:4"<<endl;break; 166 167 case 1:cout<<"数组的开始列:1"<<endl<<"数组的结束列:4"<<endl;break; 168 } 169 } 170 */ 171 172 cout<<"最大的子数组和为:max="<<max<<endl; 173 174 return 0; 175 176 }
六.结果截图
七.结对总结
我负责敲代码,在思路不同的时候,孔维春给了我帮助,有的时候是我们讨论解决问题,但是在我完全无法进行下去时,他给我提供思路,这样使我们的程序设计效率大大提高。