软件工程——求二维数组所有子矩阵的和的最大值
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为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
软件工程——求二维数组所有子矩阵的和的最大值相关推荐
- 求二维数组的子数组中的最大值!
具体代码如下: #include<iostream> using namespace std; int maxSubMatrix_BF(int *a, int m, int n) { ...
- 求二维数组中最大子数组的和
任国庆 张博 之前我们讨论了在一维数组中求最大子数组的和,在此基础上我们开始讨论二维数组的最大子数组. 求二维数组的最大子数组思想是建立在以为数组.首先将数组的第一列看成一个一维数组,找到该列的最大 ...
- 求二维数组的转置矩阵
1 /*===================================== 2 求二维数组的转置矩阵 3 输入 4 两个整数n和m 5 n行m列的二维数组 6 输出 7 输出该二维数组的转置矩 ...
- C语言求二维数组鞍点
C语言求二维数组鞍点 题目出自谭浩强C程序设计第四版 6.8 鞍点,即该位置上的元素在该行上最大,在该列上最小. 一个二维数组有可能有多个鞍点,当然也可能没有鞍点. 此代码仅考虑鞍点存在的情况 解题思 ...
- java求二维数组每行元素的和
java中不创建新的数组求二维数组中各行元素分别的和的一种思路 package com.yzy.testarray;/*** @className Array2DSum.java* @author y ...
- pta 7-3 求二维数组周边元素的累加和 (10 分)
7-3 求二维数组周边元素的累加和 (10 分) 求一个二维数组周边元素的累加和. 输入一个二维数组的行数m(m<10),列数n(n<10),二维数组的各元素值.输出周边元素之和. 输入格 ...
- C语言求二维数组平均数,一道JavaScript的二维数组求平均数的题
JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...
- 编写一个函数get_average()获取整型数组元素的平均值。要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值。
题目内容: 编写一个函数get_average()获取整型数组元素的平均值.要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值.在main()函数中通过具体的一维数组Array ...
- 结对开发--求二维数组的最大子数组
小组成员:信1201-1班 黄亚萍 信1201-1班 袁亚姣 一.题目要求 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, ...
最新文章
- 工业4.0进行时:增强现实技术如何变革制造业
- 为什么 AI 工程师要懂一点架构?
- 【django轻量级框架】一个Github用户检索信息网站(解析和代码)
- servlet+jdbc+javabean其实跟ssh差不多
- nginx+php+memcache高速缓存openresty)
- 常用正则表达式,来自新浪微博的js
- 基于redis实现的扣减库存
- P6257-[ICPC2019 WF]First of Her Name【AC自动机】
- c++ datetime mysql_转:C++操作mysql方法总结(1)
- docker search
- CSS选择器(中)——高级选择器
- 【转】关于VB中Shell及ShellExecute的总结与记录
- 42.从非托管磁盘创建虚拟机
- 可变车道怎么走不违章_还记得这种车道怎么走吗?
- ros操作系统的介绍
- 谷歌pixel3axl开发者模式_谷歌推出新一代安卓系统“Android 10”
- 通过docker搭建Yapi
- 芯片、二代测序的差别及GEO数据库界面
- r矢量球坐标系旋度_球面,柱面坐标系下的散度与旋度
- 连分数与丢番图方程简介