返回一个整数数组的最大子数组的和

#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;

}

设计思想:在上课时,经过老师的提示,再加上自己下课分析,总结思路如下:

对于一个数组,如果首位相连,那么我们可以把它当成一个环状,若想求最大子数组的和,必须把它剪开,这样就可以把复杂的问题转换成一个简单的数组求最大子数组的和,剪开后,若原来数组共n个子数,那么剪开后有n种结果,在其中一种可能中寻找最大子数组的和,找到后记录首末位子数位置,再将首尾换位置,子数位 置不变,遍历整个数组直到再找到一个最大子数组。

实验成员:冯金硕(编写代码)

郭树伟(调试代码)

猜你喜欢

转载自www.cnblogs.com/luelue/p/9904933.html
今日推荐