解题思路:
当数组是首尾相连时,求连续子数组最大和的方法可以归纳如下:
1.将原数组进行扩充,即假设原数组为{1,2,-3,4,5},则扩充相当于{1,2,-3,4,5,1,2,-3,4,5}
2.利用上述的解法在扩充后的数组进行遍历求其连续子数组的最大和,不过要做一些小改动,即保证子数组的长度在原数组的长度范围之内。这样求出来的结果即是原数组首尾相连后,连续子数组的最大和。
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
int a[25000],i,j,n,MaxSum,k,m,h,p;
int f=0;
int b[10],d[10];
cout<<"请输入数组中数字的个数"<<endl;
cin>>n;
cout<<"请输入数组"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=n;i<2*n;i++)
{
a[i]=a[i-n];
}
cout<<endl;
for(i=0;i<n;i++)
{
k=0;
MaxSum=0;
h=i;
for(j=i;j<i+n;j++)
{
k += a[j];
if(k > MaxSum)
{
MaxSum = k;
h=j;
}
if(k < 0)
{
k = 0;
}
}
d[i]=h;
b[i]=MaxSum;
}
int c=b[0];
m=0;
h=0;
for(i=1;i<n;i++)
{
if(c<=b[i])
{
c=b[i];
m=i;
h=d[i];
}
}
p=h-n+1;
if(p<=0)
{ p=n;}
cout<<"从第"<<m+1<<"个到第"<<p<<"个"<<endl;
cout<<"最大子数组为"<<endl;
for(i=m;i<h+1;i++)
{ cout<<a[i]<<" ";}
cout<<endl;
cout<<"最大子数组之和为"<<c<<endl;
}
五 总结反思
对于数组的理解更加深刻,团队合作很重要。