环形一维数组最大子集(结对)
一,题目要求
一维数组首尾连接,形成的环形数组,求出最大子集的和。
二,分析
一维数组的首尾相连,我将其数组先后顺序不变,依次将第一个数放在数组最后得到一个不同排列的数组,数组个数不变,左右元素不变。求出其最大值,最后进行比较出最大的。
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 void Input(int A[],int n)//输入数组 5 { 6 cout << "按顺序输入整数数组:"<<endl<<" "; 7 for (int i = 0; i < n; i++) 8 { 9 cin >> A[i]; 10 } 11 } 12 int *Xiugai(int *A,int n)//环形数组的每一个展开的条形数组 13 { 14 int t; 15 t = A[0]; //将第一个数放到最后,后面的数位置不变 16 for (int i = 0; i < n; i++) 17 { 18 A[i] = A[i + 1]; 19 } 20 A[n-1] = t; 21 return A; 22 23 } 24 int Max(int A[],int n)//条形数组的子数组最大值 25 { 26 int sum,max_sum; 27 28 sum = A[0], max_sum = A[0]; 29 for (int i = 1; i<n; i++) 30 { 31 if (sum>0) //从第二个数开始判断是否为正数 32 { 33 sum = sum + A[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。 34 if (sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 35 { 36 max_sum = sum; 37 } 38 } 39 else 40 { 41 sum = A[i]; //是负数,将第i+1个数的值赋值给和值sum 42 if (sum>max_sum)//并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 43 { 44 max_sum = sum; 45 } 46 } 47 } 48 return max_sum; 49 } 50 int Max1(int A[],int n)//比较最大值 51 { 52 int max_sum; 53 for (int i = 0; i < n - 1; i++) 54 { 55 if (A[i] < A[i + 1]) 56 { 57 max_sum = A[i + 1]; 58 } 59 else 60 { 61 max_sum = A[i]; 62 } 63 } 64 return max_sum; 65 } 66 int main() 67 { 68 int n,max_sum; 69 cout << "输入数组的个数:"; 70 cin >> n; 71 int *B = new int[n]; 72 int *A = new int[n]; 73 Input(A,n); 74 for (int i = 0; i < n; i++) 75 { 76 B[i] = Max(A,n); 77 A[n] = (int)Xiugai(A,n); 78 } 79 cout <<"环形数组最大值为:"<<Max1(B,n)<< endl; 80 system("pause"); 81 }





浙公网安备 33010602011771号