二维数组求最大子数组和(环形)
一、实验题目
返回一个二维数组中最大子数组的和。
实验要求:
输入一个二维整形数组,数组里有正数也有负数。 二维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 二、实验思路 这次我们设计的实验是手动输入二维数组的行数和列数,二维数组的环形求和我们设计的思路和一位数组的类似,就是把求完的数组的第一列放到最后,依次类推。求最大的子数组和时和二维数组的求和类似,即:输入的二维数组是 -1 2 3 4
-5 9
(1)首先计算出第一行中有关-1的所有的子数组,然后计算出有关2的子数组,同样的道理可以计算第二行和第三行中的字数组。
(2)把上面计算出来的有关行中的子数组放在一个 b[3][3]即为 -1 1 2 的数组中。
3 7 4
-5 4 9
(3)再求b[3][3]中的子数组的最大值,这次应该是按列来求。首先计算第一列中的子数组中的最大的数,先计算-1,然后计算-1+3,然后计算 -1+3+5,求出最大的来,再3+(-5)和max比较大小,求出最大的,再(-5)和max比较大小。同理求第二、三列。即可得出最大的来。
三、源程序
//信1201-2班 司新红 万彤 #include "stdafx.h" #include "iostream" using namespace std; int main() { int hang,lie; int a; int i,j; int s;// 求和 int count; int max; cout<<"请输入二维数组的行数:"; cin>>hang; cout<<"请输入二维数组的列数:"; cin>>lie; int **A;//定义动态二维数组 int **B; a=lie*lie; A=new int*[hang]; for(int k=0;k<hang;k++) { A[k]=new int[lie]; } B=new int*[hang]; for(int l=0;l<hang;l++) { B[l]=new int[a]; } /*数组初始化*/ cout<<"请输入二维数组中的元素"<<endl; for(int i=0;i<hang;i++) { for(int j=0;j<lie;j++) { cin>>A[i][j]; } } /*二维数组压缩函数*/ for(i=0;i<hang;i++) { count=0; for(j=0;j<lie;j++) { s=0; for(int l=0;l<lie;l++) //每一行按顺序进行枚举存入数组中 { s=s+A[i][l+j]; B[i][count+l]=s; } count=count+lie; A[i][lie+j]=A[i][j]; } } max=B[0][0]; //将数组的第一个数赋值给max for(j=0;j<a;j++) { for(i=0;i<hang;i++) { s=0; for(int r=0;r<hang-i;r++) { s=s+B[r+i][j]; //逐列对数组进行枚举,求最大值 if(max<s) { max=s; } } } } cout<<"最大子数组之和为:"<<max<<endl; return 0; }
四.实验截图
五.实验心得
我只能说老师真的是越来越为难我们了 ,我和小伙伴做了很多次的尝试才成功,其实如果上次做实验没有偷懒的话,这次的实验就不需要做这么大的手脚,其实每次的实验都是改动很小,但是由于上次的实验不是万精油,所有这次又得推翻重做。这是个教训,需要记住