结队成员:范德一,赵永恒
一.题目
返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二.设计思路
我们在上次实验的基础上,通过在原有的循环体的最外边再添加了一个循环条件,这个循环条件是在第一次循环之后,将数组中每个数的值赋给它前面一个数,这样在最后一次循环的时候就实现了首尾相连。
三.实验代码
#include<iostream.h> #include<time.h> #include<stdlib.h> int main() { int a[10]; int m; //m是每组个数 int *sum=new int[10]; srand((unsigned)time(NULL)); cout<<"*********************************"<<endl; for(int i=0;i<10;i++) { int b; b=rand()%2; switch (b) { case 0: a[i]=rand()%100; break; case 1: a[i]=-rand()%100; break; } cout<<a[i]<<" "; /* if((i%10)==4) cout<<endl; */ //每行10个输出,换行 } cout<<"*********************************"<<endl; int he=0; for(int t=1;t<11;t++) { for(m=1;m<11;m++) { int temp=0; for(int n=0;n<m;n++) { temp=temp+a[n]; } for(int k=0;k<=(10-m);k++) { sum[k]=0; for(int j=k;j<(k+m);j++) //a[k]是每组第一个数 { sum[k]=sum[k]+a[j]; } if(sum[k]>temp) { temp=sum[k]; } } if(temp>he) { he=temp; } } int temp1=0; temp1=a[0]; a[0]=a[1]; a[1]=a[2]; a[2]=a[3]; a[3]=a[4]; a[4]=a[5]; a[5]=a[6]; a[6]=a[7]; a[7]=a[8]; a[8]=a[9]; a[9]=temp1; } cout<<"最大子数组的和为: "<<he<<endl; cout<<"*********************************"<<endl; return 0; }
四.运行截图
五.实验感想
关于数组的实验这已经是第四次进行扩展了,现在回想一下,每一次的实验都有一个上一次的基础,第一次实验比较简单,我们也很容易就做了出来,然后在这个第一次实验的基础上,我们一次又一次的加深难度,逐步实现了不同的功能;倘若我们第一次实验的内容就是这样的话,我们肯定不会这么容易完成,这让我再一次体会到了把大目标分解成小目标的好处。