zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中最大子数组的和

     要求:

    1,输入一个二维整形数组,数组里有正数也有负数。

    2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和,

    3,求所有子数组的和的最大值。

    设计思路:

    参照一维整数数组求解最大子数组的方法,我们想着将二维数组通过行不同,列相加的方法转化为一维整数数组再求解最大子数组之和。

    具体实现:先求出每一行的最大子数组之和,之后比较得出最大和MaxSum,然后通过上述方法求二行的最大子数组之和并与MaxSum比较,用MaxSum存放较大值。以此类推,求三行,四行。。。

    最后实现最大子数组的输出及其和的输出。

    合作过程:

    两人合作探讨设计思路;

    一人负责分析程序,编写代码;

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

    主要代码:

     1   //二维整数数组最大子数组之和
     2   #include <iostream>
     3   #include <stdlib.h>
     4   #include <time.h>
     5   using namespace std;
     6 
     7   int main()
     8   {
     9      int M,N;
    10      cout << "输入二维数组的行数和列数:" << endl;
    11      cin >> M >> N;
    12      int data[M][N],line[N],sum = 0,d1 = 0;
    13      int MaxSum ,Maxd1,end1[M][N] = {0},end2[M][N] = {0};
    14      int i_max = 0,j_max = 0;
    15      srand((unsigned int)time(0));  //保证生成不同的随机数
    16      cout << "二维数组为:" << endl;
    17      for (int j = 0;j < M;j++)   //给二维数组的元素赋值并输出,取值范围是-25到25
    18      {
    19          for (int k = 0;k < N;k++)
    20          {
    21              data[j][k] = rand()%50 - 25;
    22              cout << data[j][k] << '	';
    23          }
    24          cout << endl;
    25      }
    26      cout << endl;
    27 
    28      MaxSum = data[0][0];    //初值赋值为数组第一行第一个元素
    29      Maxd1 = data[0][0];
    30      for (int i = 0;i < M;i++)
    31      {
    32          for (int i1 = 0;i1 < M-i;i1++)//当1行是循环M次
    33          {
    34              for (int j = 0;j < N;j++)//赋初值
    35              {
    36                  line[j] = 0;
    37              }
    38              for (int i2 = i1;i2 <= i1+i;i2++)//每次循环i次赋值
    39              {
    40                  for (int j = 0;j < N;j++)
    41                  {
    42                      line[j] += data[i2][j];
    43                  }
    44              }
    45              sum = 0;
    46              for (int k = 0;k < N;k++)
    47              {
    48                  sum += line[k];
    49                  if (sum > MaxSum)
    50                  {
    51                      MaxSum = sum;
    52                      end1[i][i1] = k;
    53                      i_max = i;       //最大的时候是i行;
    54                      j_max = i1;
    55                  }
    56                  if(sum < 0)
    57                  {
    58                      sum = 0;
    59                  }
    60              }
    61 
    62              for (int k = N-1;k >= 0;k--)
    63              {
    64                  d1 += line[k];
    65                  if (d1 > Maxd1)
    66                  {
    67                      Maxd1 = d1;
    68                      end2[i][i1] = k;
    69                  }
    70                  if(d1 < 0)
    71                  {
    72                      d1 = 0;
    73                  }
    74              }
    75 
    76          }
    77      }
    78      cout << "最大子数组为:" << endl;
    79      for (int k = 0;k <= i_max;k++)//输出最大子数组元素
    80      {
    81          for (int k1 = end2[i_max][j_max];k1 <= end1[i_max][j_max];k1++)
    82          {
    83                  cout << data[j_max+k][k1] << '	';
    84          }
    85          cout << endl;
    86      }
    87 
    88      cout << endl;
    89      cout << "最大子数组的和为: " << MaxSum << endl;
    90   }

    运行截图:

    遇到的问题及解决方法:

    日期

    编号

    类型

    引入阶段

    排除阶段

    修复时间

    修复缺陷

    10.20

     1

     循环函数错误

     设计阶段

    编码

     40min

     查找资料,完善设计思路

    描述:对如何实现最大子数组的查找思路不明确,查找并借阅相关资料,完善设计思路

    10.20

     2

     函数错误

     编码

     编译

     30min

     反复调试,查找资料

     描述:对函数编写不熟悉,bug太多,反复编译并查找错误

    体会:

    对如何查找二维整数数组最大子数组的和有了深刻的理解,对循环函数的使用也更加熟悉,但是,由于编程能力有限,无法解决算法时间复杂度的问题。上述编程的时间复杂度为O(n^3),不能达到时间复杂度为O(n)

    的目标。

    合作图片:

    组内成员:张素颖,于芳娜

  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/pcyyyyy/p/9822320.html
Copyright © 2011-2022 走看看