一.题目:

    返回一个二维整数数组中最大子数组的和。
二.要求:
    输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

三.成员

  编写程序者:岳竞一

  协同者:付东

四.编程思路

    首先,根据一维数组原理,可以先求出每个行数组的最大子数组和。

    然后,将二维3行数组分写成5行子数组的数组,3,4行为1,2和2,3行一起的子数组,5行为,1,2,3行的子数组。

    最后,求比较各行最大的子数组和。

五.源代码

#include<iostream.h>
int main()
{
 int x,y,n,m;
 int s[10][20];
 int sum[10][20];
 cout<<"请输入3行4列的矩阵:"<<endl; 
 int a[][4]={10,-20,-1,3,8,10,3,20,-2,4,2,-19} ;
 for(x=0;x<3;x++)
 {
  for(y=0;y<4;y++)
  {
   cout<<a[x][y]<<"\t";
  }
  cout<<endl;
 }
 
 //---------------------------以上是数组的输入
 
 for(x=0;x<3;x++)
 {
  for(y=0;y<4;y++)
  {
   s[x][y]=a[x][y];
  }
 }

 for(x=0;x<3;x++)
 {
  for(y=0;y<3;y++)
  {
   s[x][y+4]=a[x][y];
  }
 }


 
    for(x=0;x<2;x++)
 {
  for(y=0;y<4;y++)
  {
   s[x+3][y]=a[x][y]+a[x+1][y];
  }
 }
 

  for(x=0;x<2;x++)
 {
  for(y=0;y<3;y++)
  {
   s[x+3][y+4]=a[x][y]+a[x+1][y];
  }
 }

 for(y=0;y<4;y++)
 {
  s[5][y]=a[0][y]+a[1][y]+a[2][y];
 }

  for(y=0;y<4;y++)
 {
  s[5][y+4]=a[0][y]+a[1][y]+a[2][y];
 }
 
 
 //---------------------------------------------------
 
 
 for(x=0;x<6;x++)
 {
  for(y=0;y<7;y++)
  {
   sum[x][y]=s[x][y];//0-6
  }
  for(y=0;y<6;y++)
  {
   sum[x][y+7]=s[x][y]+s[x][y+1];//7-12
  }
  for(y=0;y<5;y++)
  {
   sum[x][y+13]=s[x][y]+s[x][y+1]+s[x][y+2];//13-17
  }
  for(y=0;y<4;y++)
  {
   sum[x][y+18]=s[x][y]+s[x][y+1]+s[x][y+2]+s[x][y+3];//18-21
  }
 }
 
 //-------------------------------------------------------------------------//一行有22个数
 /*
 for(x=0;x<6;x++)
 {
 for(y=0;y<10;y++)
 {
    
     
     if(sum[x][y]==30)
     cout<<x<<endl<<y<<endl;
     }
     
       }
 */
 //----------------------------- 
 int max=sum[0][0];
 
 for(x=0;x<6;x++)
 {
  for(y=0;y<22;y++)
  {
   if(sum[x][y]>max)
   {
    max=sum[x][y];
    n=x;
    m=y;
    
   }
  }
  
 }
 //--------------------------------------求最大数
 
/* 
 if(n<3)
 {
  cout<<"数组开始行:"<<n+1<<endl<<"数组结束行:"<<n+1<<endl;
 }
 else
 {
  n=n%3;
  switch(0)
  {
  case 0:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+1<<endl;break;
  case 1:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+1<<endl;break;
  case 2:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+2<<endl;break;
   
  }
 }

 //-----------------------------------------------------------------------------求子数组开始的行
 if(m<4)
 {
  cout<<"数组开始列:"<<m<<endl<<"数组开始列:"<<m<<endl;
 }
 else if(m>3&&m<7)
 {
  {
   m=m%4;
   switch(m)
   {
   case 0:cout<<"数组开始列:1"<<endl<<"数组结束列:2"<<endl;break;
   case 1:cout<<"数组开始列:2"<<endl<<"数组结束列:3"<<endl;break;
   case 2:cout<<"数组开始列:3"<<endl<<"数组结束列:4"<<endl;break;
   case 3:cout<<"数组开始列:1"<<endl<<"数组结束列:3"<<endl;break;
    
    
    
   }
  }
 }
 else if(m>7)
 {
  m=m%8;
  switch(m)
  {
  case 0:cout<<"数组的开始列:2"<<endl<<"数组的结束列:4"<<endl;break;
   
  case 1:cout<<"数组的开始列:1"<<endl<<"数组的结束列:4"<<endl;break;
  }
 }
 */
 
 cout<<"最大的子数组和为:max="<<max<<endl;
 
 return 0;
 
  }
  六.结果截图

 

七.结对总结

    这次我负责代码的复审,感觉任务不是很重,因为在同队在做程序的时候,几乎是都自己完成了程序的测试,我很难找到另外的错误。我在其中的作用更多的是一起帮助同伴编写程序,讲给他程序编写的原理,程序思路,但是程序指导和程序编写感觉不一样,各自想的东西不一样,以后在此实验吧。
  

posted on 2015-04-06 22:30  半梦半痴半愚蠢  阅读(97)  评论(0编辑  收藏  举报