环状二维数组最大子数组和

一.题目:

    返回一个二维整数数组中最大子数组的和。
二.要求:
    输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为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]<<"\t";
 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   }

六.结果截图

 

七.结对总结

    我负责敲代码,在思路不同的时候,孔维春给了我帮助,有的时候是我们讨论解决问题,但是在我完全无法进行下去时,他给我提供思路,这样使我们的程序设计效率大大提高。

posted @ 2015-06-17 16:01  小崔007  阅读(155)  评论(0编辑  收藏  举报