1. 程式人生 > >返回一個整數陣列的最大子陣列的和

返回一個整數陣列的最大子陣列的和

#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種結果,在其中一種可能中尋找最大子陣列的和,找到後記錄首末位子數位置,再將首尾換位置,子數位 置不變,遍歷整個陣列直到再找到一個最大子陣列。

實驗成員:馮金碩(編寫程式碼)

郭樹偉(除錯程式碼)