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

用c++實現環形數組的最大子數組之和

color 長度 http c++ 子數組和的最大值 ostream names alt 如圖所示

分析:

  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 }

測試截圖:

技術分享圖片技術分享圖片

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

用c++實現環形數組的最大子數組之和