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

    一.题目:

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

    六.结果截图

     

    七.结对总结

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

  • 相关阅读:
    文本属性和字体属性
    BZOJ 2724: [Violet 6]蒲公英
    BZOJ4010: [HNOI2015]菜肴制作
    BZOJ 2160: 拉拉队排练
    HDU-5157Harry and magic string
    HDU-5421Victor and String
    BZOJ2565: 最长双回文串(回文树)
    BZOJ3676: [Apio2014]回文串(回文树)
    BZOJ 3195: [Jxoi2012]奇怪的道路(状压dp)
    BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
  • 原文地址:https://www.cnblogs.com/cuipengbo/p/4583584.html
Copyright © 2011-2022 走看看