环状二维子数组求和

题目:返回一个二维整数数组中最大子数组的和。要求:输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。

n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,代码编程。

一人负责代码复审和代码测试计划。

发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。

结对开发过程:

这次的编程开发是基于上次的以为数组,我和我的搭档@天使RL恶魔开始了认真的讨论,再结合课堂上的同学讨论,如何能在二维数组原有的基础上,加上首尾相 连这个条件,同时降低时间复杂度,这种方法的大概思想是:遍历数组里面的每一个数将第一个数变为最后一个数,具体算法 a[i][j-1]=a[i][j],这样又变成了一个新的二维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数。

程序代码:

#include <iostream>
using namespace std;

int maxSubArray(int **a,int n,int m)
{
  int **p=new int*[n];
  int i,j;
  if(m==0||n==0)
    return 0;
  //计算p[i][j]
  for(i=0;i<n;i++)
  {
    p[i]=new int[m];
    for(j=0;j<m;j++)
    {
      if(i==0)
      {
        if(j==0)
          p[i][j]=a[i][j];
        else
          p[i][j]=p[i][j-1]+a[i][j];
      }
      else
      {
        if(j==0)
          p[i][j]=p[i-1][j]+a[i][j];
        else
          p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j];
      }
    }
  }
  //计算二维数组最大子数组的和
  int temp;
  int max=a[0][0];
  int ans;
  //如果m==1
  if(m==1)
  {
    for(i=0;i<n;i++)
    {
      for(j=i;j<n;j++)
      {
        if(i==0)
        {
          temp=p[j][m-1];
        }
        else
        {
          temp=p[j][m-1]-p[i-1][m-1];
        }
        if(ans<temp)
          ans=temp;
      }
    }
  }
  else
  {
    for(i=0;i<n;i++)
    {
      for(j=i;j<n;j++)
      {
        if(i==0)
        {
          temp=p[j][m-1]-p[j][m-2];
        }
        else
        {
          temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2];
        }
        for(int k=m-2;k>=0;k--)
        {
          if(temp<0)
            temp=0;
          if(i==0)
          {
            if(k==0)
              temp+=p[j][k];
            else
              temp+=p[j][k]-p[j][k-1];
          }
          else
          {
            if(k==0)
              temp+=p[j][k]-p[i-1][k];
            else
              temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
          }
          if(ans<temp)
            ans=temp;
        }
      }
    }
  }
  return ans;
}

int main()
{
  int n,m,temp;
  int a1,a2;
  int k=0;
  printf("请输入二维数组的行数和列数:\n");
  scanf("%d %d",&n,&m);
  int i,j;
  int **a=new int*[n];
  printf("请输入%d*%d个二维数组元素:\n",n,m);
  for(i=0;i<n;i++)
  {
    a[i]=new int[m];

    for(j=0;j<m;j++)
    {
      scanf("%d",&a[i][j]);
    }
  }
  int ans=maxSubArray(a,n,m);
  printf("二维数组的最大子数组之和是:%d\n",ans);
 for(a2=0;a2<m-1;a2++)
 { for(i=0;i<n;i++)
  {   temp=a[i][0];
      for(j=1;j<m;j++)
      {a[i][j-1]=a[i][j];}
      a[i][m-1]=temp;
  }

    for(i=0;i<n;i++)
  {
      for(j=0;j<m;j++)
      {   

          if(k%m==0)
          {cout<<endl;}
          cout<<a[i][j]<<" ";
             k++;
      }

  }

  a1=maxSubArray(a,n,m);
  printf("二维数组的最大子数组之和是:%d\n",a1);
 }
  return 0;
}

程序运行截图:

总结感受:

  在程序设计之前应该与之前的环状一位数组相联系,我们使用了相同的方法解决了问题。同样的由最后一列移到第一列,前面几列依次向后移,算出环状二维数组的最大子数组。

时间: 2024-10-13 23:27:18

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

最大二维子数组求和~

题目:输入一个整形数组,数组里有正数也有负数.组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 分析: 这样就很复杂我们可以选取其中的正数然后判断连续性当我们加上一个正数时,和会增加:当我们加上一个负数时,和会减少.如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和,用一个变量记录最大的和,最后返回即可. 代码: public class 二维子数组最大和 { public

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

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

环状二维数组(改进版)

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

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

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

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的3*6的数据 我们决定设计一个3*6行的二维数组进行计算,依次进行比较 将最大子数组的和返回 代码 1 #include <iostream.h> 2 int main() 3 { 4 int a[3][6];//定义一个3*6的二维数组 5 int max; 6 int s;//求和 7 int count; 8 int b[3][7]; 9 cout<<"请输入二维数组(3*6)中的元素:"

lintcode循环数组之连续子数组求和

v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. v 样例 给定 [3, 1, -100, -3, 4], 返回 [4,0]. v 思路 1.如果不是循环数组,求解连续子区间和的思路如下: 首先设一个累加变量和sum和最大值变量maxN,[ld, rd]表示当前正在累加的区间,[lt,rt]表示最大和的区间.从左边开始一直累加,并初始当前区间[ld

软件工程子数组求和2

1.设计思想:首先想到首尾相连和不相连的区别在哪?区别在最后一个数还可以和前面的数组成一个新的数组:然后就是怎样考虑 用数组储存首尾相连的数组,是否需要加入其他限制条件等? 2.出现的问题:首尾相连数组无法同其他数组一样储存到一个数组中. 4.源代码: package 子数组求和2; import java.util.Scanner; public class test { public static void main(String[] args) { // TODO Auto-generat

结对开发-求环状二维数组最大子数组

结对成员:信1201-1班    黄亚萍 信1201-1班    袁亚姣 一.题目要求 要求:            输入一个二维整形数组,数组里有正数也有负数.            二维数组首尾相接,象个一条首尾相接带子一样.            数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.            求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.设计思路 类似于3,将二维数组转化为一维数组来求最大子数组

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

一.题目: 返回一个二维整数数组中最大子数组的和.二.要求:    输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 三.成员 编写程序者:岳竞一 协同者:付东 四.编程思路 首先,根据一维数组原理,可以先求出每个行数组的最大子数组和. 然后,将二维3行数组分写成5行子数组的数组,3,4行为1,2和2,3行一起的子数组,5行为,1,2,3行的