1. 程式人生 > >用c++實現環形陣列的最大子陣列之和

用c++實現環形陣列的最大子陣列之和

分析:

  1.將環形陣列,剪開變成一個一維陣列。

  2.用一維陣列的最大子陣列和解決。

對於一個環形陣列,表示成一個一維陣列總共有n種。如圖所示:

程式程式碼:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     cout<<"請輸入一維陣列的長度:";
 7     cin>>n;
 8     int *p=new int[n];//定義陣列指標
 9     cout<<"請依次輸入陣列元素:"<<endl;
10 for(int i=0;i<n;i++) 11 { 12 cin>>p[i]; 13 } 14 int t,m,*sum=new int[n],*max_sum=new int[n]; 15 //*sum儲存子陣列的和,*max_sum儲存最大子陣列的和 16 for(int i=0;i<n;i++) 17 { 18 sum[i]=p[0]; 19 max_sum[i]=p[0]; 20 for(int j=1;j<n;j++) 21 {
22 if(sum[i]>0)//從第二個數開始判斷是否為正數 23 { 24 sum[i]=sum[i]+p[j]; //是正數,將和值(初始值為p【0】)和第i+1個數做和。 25 if(sum[i]>max_sum[i])// 並判斷是否為最大,是讓其賦值給max_sum,並將子陣列末位置改變。 26 { 27 max_sum[i]=sum[i]; 28 } 29 }
30 else 31 { 32 sum[i]=p[j]; //是負數,將第i+1個數的值賦值給和值sum 33 if(sum[i]>max_sum[i]) //並判斷是否為最大,是讓其賦值給max_sum,並將子陣列初、末位置改變。 34 { 35 max_sum[i]=sum[i]; 36 } 37 } 38 } 39 m=p[0];//環形陣列轉換成新的一維陣列 40 p[0]=p[n-1]; 41 for(int k=0;k<n-1;k++) 42 { 43 t=m; 44 m=p[k+1]; 45 p[k+1]=t; 46 } 47 } 48 int max=max_sum[0];//max為所有最大子陣列和的最大值 49 for(int i=1;i<n;i++) 50 { 51 if(max_sum[i]>max)//比較 52 { 53 max=max_sum[i]; 54 } 55 } 56 cout<<"最大子陣列的和為"<<max<<endl;//輸出 57 return 0; 58 }

 

測試截圖:

實驗總結:對於環形陣列只需將其化簡成一維陣列形式,再對其求最大子陣列的和即可,完全等價於一維陣列。將其化簡成幾小步去做就簡單很多了。