题目:返回一个整数数组中最大子数组的和。
要求:
  输入一个整形数组,数组里有正数也有负数。
  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求:
  两人结对完成编程任务。
  一人主要负责程序分析,代码编程。
  一人负责代码复审和代码测试计划。
一、设计思想
  求二维数组最大子数组的和,可以转化为求一维数组最大子数组的和
我们有一个最初的二维数组a[n][m],找它的 最大子数组之和
  1.我们先建立一个新的二维数组b[n][m],二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0] 的最大值

  2.循环:从a[0][0]开始 以此是 a[0][1]、 a[0][2]……a[0][m]、

                a[1][0]、 a[1][1]……a[1][m]、

                a[2][0]、 a[2][1]……a[2][m]、

                  ……

                a[n][0]、 a[n][1]……a[n][m]、

具体循环工作:当循环到a[j][k](0<=j<n,0<=k<m)则求的是 a[j][k]到 a[0][0] 的最大值

计算方法:根据b[j-1][k]、b[j][k-1]、b[j-1][k-1]的正负情况,来计算b[j][k],根据包含a[j][k]的各种矩阵情况,求得最大值。

3.求出b[m][n]中的最大值。

二、源代码

  1 #include<iostream>
  2 using namespace std;
  3 int main()
  4 {
  5     int i,j;
  6     int a[3][3]={-1,-2,3,1,-3,2,4,4,-1};
  7     int b[3][3];
  8     int max=a[0][0];
  9     for(i=0;i<3;i++)
 10     {
 11         for(j=0;j<3;j++)
 12         {
 13             cout<<a[i][j]<<' ';
 14         }
 15         cout<<endl;
 16     }
 17     for(i=0;i<1;i++)
 18     {
 19         b[0][0]=a[0][0];
 20         for(j=0;j<3;j++)
 21         {
 22             if(a[0][j-1]<0)
 23             {
 24                 b[0][j]=a[0][j];
 25             }
 26             else
 27             {
 28                 b[0][j]=b[0][j-1]+a[0][j];
 29             }
 30         }
 31     }
 32     for(i=1;i<3;i++)
 33     {
 34         for(j=0;j<1;j++)
 35         {
 36             if(a[i-1][0]<0)
 37             {
 38                 b[i][0]=a[i][0];
 39             }
 40             else
 41             {
 42                 b[i][0]=b[i-1][0]+a[i][0];
 43             }
 44         }
 45     }
 46     for(i=1;i<3;i++)
 47     {
 48         for(j=1;j<3;j++)
 49         {
 50             if(b[i-1][j-1]<0)
 51             {
 52                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
 53                 {
 54                     if(b[i][j-1]>=b[i-1][j])
 55                     {
 56                         b[i][j]=b[i][j-1]+a[i][j];
 57                     }
 58                     else
 59                     {
 60                         b[i][j]=b[i-1][j]+a[i][j];
 61                     }
 62                 }
 63                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
 64                 {
 65                     b[i][j]=b[i-1][j]+a[i][j];
 66                 }
 67                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
 68                 {
 69                     b[i][j]=b[i][j-1]+a[i][j];
 70                 }
 71                 else
 72                 {
 73                     b[i][j]=a[i][j];
 74                 }
 75             }
 76             else
 77             {
 78                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
 79                 {
 80                     b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
 81                 }
 82                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
 83                 {
 84                     b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
 85                 }
 86                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
 87                 {
 88                     b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
 89                 }
 90                 else
 91                 {
 92                     b[i][j]=a[i][j];
 93                 }
 94             }
 95         }
 96     }
 97     for(i=0;i<3;i++)
 98     {
 99         for(j=0;j<3;j++)
100         {
101             cout<<b[i][j]<<" ";
102         }
103         cout<<endl;
104     }
105     for(i=0;i<3;i++)
106     {
107         for(j=0;j<3;j++)
108         {
109             if(b[i][j]>max)
110                 max=b[i][j];
111         }
112     }
113     cout<<"max="<<max<<endl;
114     return 0;
115 }

三、运行结果截图

有正有负:

全是正数:

全是负数:

四、心得体会

   首先是设计思想,一开始我们思路比较混乱,先找到一共有多少个子矩阵,想着怎么样才能把整个数组的所有子矩阵都遍历一遍,也不知道具体怎么样用程序实现。

课上有同学介绍他们自己的思路,使我们确定了一条可以执行的思路。

程序的编写具有极大挑战性,由于是二维数组,行列老是弄混,元素想加时情况又多,要随时注意思路清晰。

附:

转载于:https://www.cnblogs.com/maximumminimum/p/4360211.html

软件工程——求二维数组所有子矩阵的和的最大值相关推荐

  1. 求二维数组的子数组中的最大值!

    具体代码如下: #include<iostream> using namespace std; int maxSubMatrix_BF(int *a, int m, int n)  {  ...

  2. 求二维数组中最大子数组的和

    任国庆  张博 之前我们讨论了在一维数组中求最大子数组的和,在此基础上我们开始讨论二维数组的最大子数组. 求二维数组的最大子数组思想是建立在以为数组.首先将数组的第一列看成一个一维数组,找到该列的最大 ...

  3. 求二维数组的转置矩阵

    1 /*===================================== 2 求二维数组的转置矩阵 3 输入 4 两个整数n和m 5 n行m列的二维数组 6 输出 7 输出该二维数组的转置矩 ...

  4. C语言求二维数组鞍点

    C语言求二维数组鞍点 题目出自谭浩强C程序设计第四版 6.8 鞍点,即该位置上的元素在该行上最大,在该列上最小. 一个二维数组有可能有多个鞍点,当然也可能没有鞍点. 此代码仅考虑鞍点存在的情况 解题思 ...

  5. java求二维数组每行元素的和

    java中不创建新的数组求二维数组中各行元素分别的和的一种思路 package com.yzy.testarray;/*** @className Array2DSum.java* @author y ...

  6. pta 7-3 求二维数组周边元素的累加和 (10 分)

    7-3 求二维数组周边元素的累加和 (10 分) 求一个二维数组周边元素的累加和. 输入一个二维数组的行数m(m<10),列数n(n<10),二维数组的各元素值.输出周边元素之和. 输入格 ...

  7. C语言求二维数组平均数,一道JavaScript的二维数组求平均数的题

    JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...

  8. 编写一个函数get_average()获取整型数组元素的平均值。要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值。

    题目内容: 编写一个函数get_average()获取整型数组元素的平均值.要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值.在main()函数中通过具体的一维数组Array ...

  9. 结对开发--求二维数组的最大子数组

    小组成员:信1201-1班  黄亚萍 信1201-1班  袁亚姣 一.题目要求 程序要使用的数组放在一个叫 input.txt 的文件中,  文件格式是: 数组的行数, 数组的列数, 每一行的元素,  ...

最新文章

  1. 工业4.0进行时:增强现实技术如何变革制造业
  2. 为什么 AI 工程师要懂一点架构?
  3. 【django轻量级框架】一个Github用户检索信息网站(解析和代码)
  4. servlet+jdbc+javabean其实跟ssh差不多
  5. nginx+php+memcache高速缓存openresty)
  6. 常用正则表达式,来自新浪微博的js
  7. 基于redis实现的扣减库存
  8. P6257-[ICPC2019 WF]First of Her Name【AC自动机】
  9. c++ datetime mysql_转:C++操作mysql方法总结(1)
  10. docker search
  11. CSS选择器(中)——高级选择器
  12. 【转】关于VB中Shell及ShellExecute的总结与记录
  13. 42.从非托管磁盘创建虚拟机
  14. 可变车道怎么走不违章_还记得这种车道怎么走吗?
  15. ros操作系统的介绍
  16. 谷歌pixel3axl开发者模式_谷歌推出新一代安卓系统“Android 10”
  17. 通过docker搭建Yapi
  18. 芯片、二代测序的差别及GEO数据库界面
  19. r矢量球坐标系旋度_球面,柱面坐标系下的散度与旋度
  20. 连分数与丢番图方程简介

热门文章

  1. 运维需要掌握的基础知识
  2. cnblogs反对按钮点击测试
  3. 您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
  4. 在DWZ框架中整合kindeditor复文本框控件
  5. java部署web service的方式
  6. Add A Qdisk After configure RHCS
  7. Data Lake Analytics + OSS数据文件格式处理大全
  8. 架构模式:MVC与MVVM
  9. Ubuntu安装.run文件
  10. laydate 使用