用c++實現環形陣列的最大子陣列之和
阿新 • • 發佈:2018-11-03
分析:
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 }
測試截圖:
實驗總結:對於環形陣列只需將其化簡成一維陣列形式,再對其求最大子陣列的和即可,完全等價於一維陣列。將其化簡成幾小步去做就簡單很多了。