zoukankan      html  css  js  c++  java
  • 二维数组循环求最大子数组

    一、题目要求

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

            }   

        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;     

    }         

    三、实验结果截图

    四、实验心得

      在这次实验中,按老师要求,我参与了编写工作,发现说和做是不一样的,只有你真正的动手去做一个东西的时候,你才能发现有什么缺点,有什么错误,方便改正,总结经验,最后感谢我的队友给与的帮助

    五、合作图像

  • 相关阅读:
    ECS7天实践进阶训练营Day1:使用阿里云ECS,快速搭建、管理VuePress静态网站
    网络设备配置与管理(华为)基础系列 :VLAN故障排除和GVRP
    网络设备配置与管理(华为)基础系列 20190411
    CentOS7.0小随笔——指令基本操作(Part.B)
    网络设备配置与管理(华为)基础系列 20190404
    CentOS7.0小随笔——指令基本操作(Part.A)
    排球计分员用户故事
    罗辑思维-如何成为一个高手 (观后感)
    第18周个人工作量总结
    第18周项目冲刺流程总结
  • 原文地址:https://www.cnblogs.com/yue3475975/p/4399826.html
Copyright © 2011-2022 走看看