环状二维数组最大子数组和

一.题目:

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

七.结对总结

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

时间: 2024-11-07 14:06:57

环状二维数组最大子数组和的相关文章

软件工程概论---环状二维数组最大子数组和

1,题目要求 根据软件工程概论--<环状一维数组最大子数组和>和<二维数组最大子数组和>两篇博客,求环状二维数组的和. 2,思路设计 根据前面两篇博客思路做参考.在二维数组的基础上扩充二维数组的列为2*col-1.再进行二维数组的求和即可. 3,代码 #include <iostream> #include<time.h> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define M

环状二维数组最大子数组求和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 结对开发过程: 这次的编程开发是基于上次的以为数

环状二维数组(改进版)

上一篇环状二维数组还存在问题,当时并未判断产生的子矩阵是否超过矩阵的范围,所以结果会出现问题. 改进版的程序中对此进行了判断. 此问题分为两种,一种是最大子数组成环,一种是最大子数组未成环.未成环的部分之前已实现,下面是成环部分. 开始的思路是:将矩阵进行扩大,类似于一维数组,但是扩大后就会出现子矩阵的范围有可能超出矩阵的范围.所以在此处要有一个判断. 改进后的程序 #include <iostream> #include<time.h> using namespace std;

环形二维数组最大子数组的和

设计思路: 因为之前做过二维数组的和环形一维数组的,所以第一感觉就是能不能把这两种整改一下结合起来,所以采用的做法就是将二维环形变化为一维环形,在此采用的方法是从第一行开始,第一行计算出最大子数组,然后第一行和第二行相加为一维计算最大子数组,然后第一行.第二行和第三行,以此类推,最后将各子数组的最大值进行比较,得到最大的即为子数组和的最大值. 实验代码: //环形一维数组求最大子数组 package erwei; public class oneArray { private int i; pu

首尾相连的二维数组最大子数组求和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 结对开发过程: 这次的编程开发是基于上次的以为数

编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

      首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了. 这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式: 以左上角的元素(1,1)和当前元素(i,j)为顶点对的子矩阵的部分和,部分和的计算如下 PS[i][j] = A[i][j]+PS[

求二维数组最大子数组的和

结对开发成员:朱少辉,侯涛亮 朱少辉:负责程序分析,代码编程 侯涛亮:负责代码复审和代码测试 设计思路: 根据求一维子数组的最大子数组和的列子,把二维数组分解成若干个一维子数组,如m行n列的数组可分为(m+1)*m/2个子数组,在求每个一维数组的最大子数组和,把这些和放入一个数组中,求这个数组的最大值就是二维数组最大子数组的和.这种算法的时间复杂度为o(n^3). 代码: #include<iostream> using namespace std; void main() { int m,n

返回一个二维整数数组最大子数组的和

 要求: 1,输入一个二维整形数组,数组里有正数也有负数. 2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和, 3,求所有子数组的和的最大值. 设计思路: 参照一维整数数组求解最大子数组的方法,我们想着将二维数组通过行不同,列相加的方法转化为一维整数数组再求解最大子数组之和. 具体实现:先求出每一行的最大子数组之和,之后比较得出最大和MaxSum,然后通过上述方法求二行的最大子数组之和并与MaxSum比较,用MaxSum存放较大值.以此类推,求三行,四行... 最后实现最大子数

环状二维子数组求和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 结对开发过程: 这次的编程开发是基于上次的以为数

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

设计思路: 一维循环数组:一维整数组头跟尾相连形成一个环. 问题解决方案:将一个一维数组扩大两倍,求新的数组的最大子数组即可. import java.io.IOException; public class xunhuanshuzu { public static void main(String[] args)throws IOException{ int []a= {23,-12,234,-234,123,2,0,1,-1,-34}; int n=a.length; int []b=new