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


     要求:

    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)

    的目标。

    合作图片:

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

  • 相关阅读:
    2-SAT( tarjan应用 )
    字节流和字符流
    linux 安装kafka
    网络编程入门
    Java代码中的魔法值
    动态SQL
    update语句的返回值是什么
    dual表
    diy diy diy台式机走起
    js数组赋值,改变其中一个,另一个数组也会改变(vue中数据绑定)
  • 原文地址:https://www.cnblogs.com/pcyyyyy/p/9822320.html
Copyright © 2020-2023  润新知