返回一个二维整数数组中最大子数组的和
源代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void main()
{
int a[20],b,c,d=0,i,j,k,t=-100,o=-100,x,y;
cout<<"请输入数值范围:"<<endl;
cin>>b>>c;
cout<<"生成数组为:"<<endl;
srand(unsigned(time(0)));
for (i=0;i<20;i++)
{
a[i]=rand()%(c-b+1)+b;
cout<<a[i]<<" ";
}
for (i=0;i<20;i++)
{
for (j=i;j<20;j++)
{
d=0;
for (k=i;k<=j;k++)
{
d=d+a[k];
}
if (d>t) {t=d;x=i;y=j;}
}
if (t>o) o=t;
}
cout<<endl<<"最大子数组的和:"<<endl;
for (i=x;i<=y;i++)
{
if (a[i]>=0)
{
cout<<a[i];
}
else cout<<"("<<a[i]<<")";
if (i!=y) cout<<"+";
else cout<<"=";
}
cout<<o<<endl;
}
#include <cstdlib>
#include <ctime>
using namespace std;
void main()
{
int a[20],b,c,d=0,i,j,k,t=-100,o=-100,x,y;
cout<<"请输入数值范围:"<<endl;
cin>>b>>c;
cout<<"生成数组为:"<<endl;
srand(unsigned(time(0)));
for (i=0;i<20;i++)
{
a[i]=rand()%(c-b+1)+b;
cout<<a[i]<<" ";
}
for (i=0;i<20;i++)
{
for (j=i;j<20;j++)
{
d=0;
for (k=i;k<=j;k++)
{
d=d+a[k];
}
if (d>t) {t=d;x=i;y=j;}
}
if (t>o) o=t;
}
cout<<endl<<"最大子数组的和:"<<endl;
for (i=x;i<=y;i++)
{
if (a[i]>=0)
{
cout<<a[i];
}
else cout<<"("<<a[i]<<")";
if (i!=y) cout<<"+";
else cout<<"=";
}
cout<<o<<endl;
}
运行结果:
设计思路:
对于一个数组,如果首位相连,那么我们可以把它当成一个环状,若想求最大子数组的和,必须把它剪开,这样就可以把复杂的问题转换成一个简单的数组求最大子数组的和,剪开后,若原来数组共n个子数,那么剪开后有n种结果,在其中一种可能中寻找最大子数组的和,找到后记录首末位子数位置,再将首尾换位置,子数位 置不变,遍历整个数组直到再找到一个最大子数组,例如第一次找到的末尾是第n个位置,那么下次就遍历第一个元素,因此环状数组不同于链状数组的地方就在于链状中是最大就是最大,而环状的数 组还要考虑首尾相接的地方。
本次编程主要由我和我的搭档冯金硕完成,过程中遇到了许多困难,但更加锻炼了结对开发的能力,还有不足的地方希望以后可以解决。