然后再用一维数组求解最大子数组的方法即可。值得注意的是,子数组的长度不可超过n,在我程序中有所体现。最终,因为没有要求时间复杂度的问题,我选择
了遍历的方法求解了此问题。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n; 6 cout<<"输入环形数组的长度:"; 7 cin>>n; 8 int *p; 9 p=new int[n]; 10 for(int i=0;i<n;i++) 11 { 12 cin>>p[i]; 13 } 14 int *q; 15 q=new int[2*n-1]; 16 for(int i=0;i<2*n-1;i++) 17 { 18 if(i<n) 19 { 20 q[i]=p[i]; 21 } 22 if(i>=n) 23 { 24 q[i]=p[i-n]; 25 } 26 //cout<<q[i]; 27 } 28 int *a=new int[n*n]; 29 //对数组a[]进行初始化; 30 for(int i=0;i<n*n;i++) 31 { 32 a[i]=0; 33 } 34 int t=0; 35 //利用枚举法,将子数组列举出; 36 for(int i=0;i<n;i++) 37 { 38 for(int j=i;j<n+i;j++)//因为环形子数组最大长度最多为n;而n+i-i即为n; 39 { 40 for(int z=i;z<=j;z++) 41 { 42 a[t]=a[t]+q[z]; 43 } 44 t++; 45 } 46 } 47 //求出最大子数组; 48 for (int i = 0; i <n*n; i++) 49 { 50 if (a[0] < a[i]) 51 { 52 a[0] = a[i]; 53 } 54 } 55 cout<< "最大子数组的和为:"<<a[0] << endl; 56 57 system("pause"); 58 return 0; 59 }
运行结果截图:
合作图: