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

 要求:

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

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

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

设计思路:

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

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

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

合作过程:

两人合作探讨设计思路;

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

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

主要代码:

 //二维整数数组最大子数组之和
  #include <iostream>
  #include <stdlib.h>
  #include <time.h>
  using namespace std;

  int main()
  {
     int M,N;
     cout << "输入二维数组的行数和列数:" << endl;
     cin >> M >> N;
     int data[M][N],line[N],sum = 0,d1 = 0;
     int MaxSum ,Maxd1,end1[M][N] = {0},end2[M][N] = {0};
     int i_max = 0,j_max = 0;
     srand((unsigned int)time(0));  //保证生成不同的随机数
     cout << "二维数组为:" << endl;
     for (int j = 0;j < M;j++)   //给二维数组的元素赋值并输出,取值范围是-25到25
     {
         for (int k = 0;k < N;k++)
         {
             data[j][k] = rand()%50 - 25;
             cout << data[j][k] << ‘\t‘;
         }
         cout << endl;
     }
     cout << endl;

     MaxSum = data[0][0];    //初值赋值为数组第一行第一个元素
     Maxd1 = data[0][0];
     for (int i = 0;i < M;i++)
     {
         for (int i1 = 0;i1 < M-i;i1++)//当1行是循环M次
         {
             for (int j = 0;j < N;j++)//赋初值
             {
                 line[j] = 0;
             }
             for (int i2 = i1;i2 <= i1+i;i2++)//每次循环i次赋值
             {
                 for (int j = 0;j < N;j++)
                 {
                     line[j] += data[i2][j];
                 }
             }
             sum = 0;
             for (int k = 0;k < N;k++)
             {
                 sum += line[k];
                 if (sum > MaxSum)
                 {
                     MaxSum = sum;
                     end1[i][i1] = k;
                     i_max = i;       //最大的时候是i行;
                     j_max = i1;
                 }
                 if(sum < 0)
                 {
                     sum = 0;
                 }
             }

             for (int k = N-1;k >= 0;k--)
             {
                 d1 += line[k];
                 if (d1 > Maxd1)
                 {
                     Maxd1 = d1;
                     end2[i][i1] = k;
                 }
                 if(d1 < 0)
                 {
                     d1 = 0;
                 }
             }

         }
     }
     cout << "最大子数组为:" << endl;
     for (int k = 0;k <= i_max;k++)//输出最大子数组元素
     {
         for (int k1 = end2[i_max][j_max];k1 <= end1[i_max][j_max];k1++)
         {
                 cout << data[j_max+k][k1] << ‘\t‘;
         }
         cout << endl;
     }

     cout << endl;
     cout << "最大子数组的和为: " << MaxSum << endl;
  }

遇到的问题及解决方法:


日期


编号


类型


引入阶段


排除阶段


修复时间


修复缺陷


10.20


1


循环函数错误


设计阶段


编码


40min


查找资料,完善设计思路


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


10.20


2


函数错误


编码


编译


30min


反复调试,查找资料


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

体会:

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

的目标。

合作图片:

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

原文地址:https://www.cnblogs.com/09-15/p/9822357.html

时间: 2025-01-19 07:17:44

返回一个二维整数数组最大子数组的和的相关文章

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

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

返回一个二维整数数组中最大子数组的和(头尾相接)

1.题目. 题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思想. 分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵.比较其中最大的子矩阵值,找出最大的. 3.代码. #include<iostream> using namespace

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

题目:返回一个二维整数数组中最大子数组的和2 要求:输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 代码: 截图: 总结:

结对开发之《返回一个二维整数数组中最大子数组的和》

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划.发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月9日24:00) 二.编程思路 我们的思路比较简单,采用的是将

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

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 两人结对完成编程任务.一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月21日24:00) 二.设计思路 本次实验设计思路非常简单,就

返回一个二维整数数组中最大子数组的和(圆柱形)

题目: 返回一个二维整数数组中最大子数组的和 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 组员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路: 本次的任务是二维数组的环状求最大子数组,结合前两次的开发经验我们把一维数组环状的思路继续在二维数组中使用,首先输入数组时令数组的列扩大一倍,也就是令数组后的数组长度的值与前边的数

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的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)中的元素:"

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

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

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个二维整数数组中最大联通子数组的和(思路)

返回一个二维整数数组中最大联通子数组的和 题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: (方法一)首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. (方