标签:
结队成员:范德一,赵永恒
一.题目
返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组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;
}
四.运行截图

五.实验感想
关于数组的实验这已经是第四次进行扩展了,现在回想一下,每一次的实验都有一个上一次的基础,第一次实验比较简单,我们也很容易就做了出来,然后在这个第一次实验的基础上,我们一次又一次的加深难度,逐步实现了不同的功能;倘若我们第一次实验的内容就是这样的话,我们肯定不会这么容易完成,这让我再一次体会到了把大目标分解成小目标的好处。
标签:
原文地址:http://www.cnblogs.com/myblog1993/p/4378391.html