二维数组循环求最大子数组

一、题目要求

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

二、源代码

#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 @ 2015-04-07 22:25  阳光少年郎  阅读(153)  评论(0编辑  收藏  举报