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

    一.题目:

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

     

    七.结对总结

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

  • 相关阅读:
    [转]MySQL日志——Undo | Redo
    linux查看系统的硬件信息
    Linux HDD information (SATA/SCSI/SAS/SSD)
    sysbench 0.5使用手册
    MYSQL数据丢失讨论
    innodb_flush_method理解
    快速从mysqldump文件中恢复一个表
    Python 交互模式中 Delete/Backspace 键乱码问题
    Django--源码安装
    greenplum-时间处理
  • 原文地址:https://www.cnblogs.com/bmbcbyc/p/4396900.html
Copyright © 2011-2022 走看看