zoukankan      html  css  js  c++  java
  • 合作项目5

    结组成员:信1201-1柴珏辉 信1201-2邓锐

    一、要求

    1、题目:

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

    2、要求:

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

    二、设计思路

    整体思路与上一篇首尾相连的一维数组求最大子数组的相同,在求二维数组的最大子数组程序上进行了修改,重复输入一遍数组实现环状,在行列上分别遍历,限制首尾两个位置不超过一个整体数组。

    三、程序代码

    复制代码
     1 #include<iostream.h>
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<time.h>
     5 #define N 6   //行数
     6 #define M 10  //列数
     7 void qiuhe(int a[N][M*2],int &he,int i,int j,int k,int l) //求两个顶点数所确定的矩阵之和,[i,j]为第一个数的下标,[k,l]为第二个数的下标
     8 {
     9     int c,b;
    10     he=0;
    11     for(c=i;c<=k;c++)
    12     {
    13         for(b=j;b<=l;b++)
    14         {
    15             he=he+a[c][b];
    16         }
    17     }
    18 }
    19 void display(int a[N][M*2],int i,int j,int k,int l)  //输出两个顶点数所确定的矩阵,[i,j]为第一个数的下标,[k,l]为第二个数的下标
    20 {
    21     int b,c;
    22     for(c=i;c<=k;c++)
    23     {
    24         for(b=j;b<=l;b++)
    25         {
    26             cout<<a[c][b]<<" ";
    27         }
    28         cout<<endl;
    29     }
    30 }
    31  void main()
    32  {
    33      int a[N][M*2];
    34      srand((unsigned)time(NULL));
    35      int i,j,k,l,hang1=0,hang2=0,lie1=0,lie2=0,max=a[0][0],he=0;
    36      for(i=0;i<N;i++)         //对二维数组中的数随机生成
    37      {
    38          for(j=0;j<M;j++)
    39          {
    40              a[i][j]=rand()%20-9;
    41              a[i][j+M]=a[i][j];   //横向重复输出一遍数组,实现首尾相连
    42          }
    43      }
    44      for(i=0;i<N;i++)
    45      {
    46          for(j=0;j<M;j++)           //前两个循环遍历第一个顶点数
    47          {
    48              for(k=i;k<N;k++)
    49              {
    50                  for(l=j;l<M+j;l++)    //后两个循环遍历第二个顶点数
    51                  {
    52                      qiuhe(a,he,i,j,k,l);
    53                      if(he>max)
    54                      {
    55                          max=he;
    56                          hang1=i;
    57                          hang2=k;
    58                          lie1=j;
    59                          lie2=l;
    60                      }
    61                  }
    62              }
    63          }
    64      }
    65      cout<<"原数组:"<<endl;
    66      display(a,0,0,N-1,M-1);
    67      cout<<"最大子数组(两个顶点坐标("<<hang1+1<<","<<lie1+1<<")"<<"("<<hang2+1<<",";
    68      if(lie2>M)
    69      {
    70         cout<<lie2+1-M<<"))"<<endl;
    71      }
    72      else
    73      {
    74          cout<<lie2+1<<"))"<<endl;
    75      }
    76      display(a,hang1,lie1,hang2,lie2);
    77      cout<<"和为:"<<max<<endl;
    78  }
    复制代码

     截图:

     四、测试

    1.数组元素数量

    N=600

    M=1000

    数据过大不能实现……

     2.数据大小

     a[i][j]=(rand()%20000)-10000 

    五、心得体会

    这次的题目是在我们合作项目2基础上修改的,基本思想与上一次题目的一样,实现起来没有用太多时间,但在算法复杂度上还需要改进。

    结组成员照片:

  • 相关阅读:
    memcached 细究(一)
    centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令
    判断php变量是否定义,是否为空,是否为真的一览表
    php 在函数前面加个@的作用
    apache Header set Cache-Control
    windows上memecache添加多个端口命令
    Android 4.4KitKat AudioFlinger 流程分析
    Android 4.4KitKat Sound System
    Android 4.4KitKat AudioTrack 流程分析
    Android Shell Cmd
  • 原文地址:https://www.cnblogs.com/boluoland/p/4385560.html
Copyright © 2011-2022 走看看