要求: n输入一个二维整形数组,数组里有正数也有负数。
n二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
n求所有子数组的和的最大值。要求时间复杂度为O(n)。
组员:常啸帆( 负责程序分析,代码编程),毕文强( 负责代码复审和代码测试计划)
思路:对前几天所做的返回一维数组中最大子数组的和进行改进,二维数组求最大子数组是从一维数组扩展而来,只是多了一个变量,同时定义两个变量,分析变量的范围,然后从第一行开始确定最大子数组范围,把最大子数组分成若干行,再用一维数组求子数组之和最大值的方法。依次求出最大值,依次比较,保留最大的。
实验代码:
#include<iostream>
using
namespace
std;
void
main ()
{
int
x,y,i,j,m=0,A[100][100];
cout<<
"输入矩阵的行()和列"
;
cin>>x>>y;
if
(x>100||y>100)
{
cout<<
"请重新输入:"
;
cin>>x>>y;
}
for
(i=0;i<x;i++)
{
for
(j=0;j<y;j++)
{
cin>>A[i][j];
}
}
int
sum[100]={0},max=0,result=A[0][0];
for
(i=0;i<x;i++)
//确定子数组的最大上界(为第i行)
{
while
(m+i<x)
//确定子数组有m+i行
{
//把子数组当成一位数组一样,求最大子数组的和
for
(j=0;j<y;j++)
{
sum[j]=sum[j]+A[m+i][j];
}
max=0;
for
(j=0;j<y;j++)
{
if
(max+sum[j]>sum[j])
{
max=max+sum[j];
}
else
{
max=sum[j];
}
if
(max>result)
{
result=max;
}
}
m++;
//是子数组的行数+1
}
//初始化m和sum[]的值,使子数组最大上界下降1,之后重新循环。
m=0;
for
(j=0;j<y;j++)
{
sum[j]=0;
}
cout<<result;
}
实验结果:
![](https://img2018.cnblogs.com/blog/1500217/201810/1500217-20181021163744482-490848185.png)
实验总结:本次实验代码是参照之前同学们所做的成果,其中对他有个深刻的分析,明白了二维数组是由一维数组发展而来的,那么思路就是想方设法的把二维数组化为一维数组或者类似于一维数组的解决办法来实现我们的目的。
![](https://img2018.cnblogs.com/blog/1500217/201810/1500217-20181021164231529-1830188127.png)