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

源代码:

 #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种结果,在其中一种可能中寻找最大子数组的和,找到后记录首末位子数位置,再将首尾换位置,子数位 置不变,遍历整个数组直到再找到一个最大子数组,例如第一次找到的末尾是第n个位置,那么下次就遍历第一个元素,因此环状数组不同于链状数组的地方就在于链状中是最大就是最大,而环状的数  组还要考虑首尾相接的地方。

      本次编程主要由我和我的搭档冯金硕完成,过程中遇到了许多困难,但更加锻炼了结对开发的能力,还有不足的地方希望以后可以解决。

posted @ 2018-11-04 17:58  肉肉  阅读(136)  评论(0编辑  收藏  举报