结对作业
1.分解问题,将环形数组,剪开变成一个一维数组。
2.用一维数组的最大子数组和解决。
对于一个环形数组,对每一个一维数组的表示共有n-1种
源代码如下:
1 #include<iostream> 2 using namespace std; 3 int max_sum1(int a[],int n) 4 { 5 int max_sum_h=0; 6 int t,k=n-1; 7 while(k) 8 { 9 int sum=a[0]; 10 int max_sum=a[0]; 11 for(int i=1;i<n;i++) 12 { 13 if(sum>0) //从第二个数开始判断是否为正数 14 { 15 sum=sum+a[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。 16 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 17 { 18 max_sum=sum; 19 } 20 } 21 else 22 { 23 sum=a[i]; //是负数,将第i+1个数的值赋值给和值sum 24 if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 25 { 26 max_sum=sum; 27 } 28 } 29 } 30 //每一种结果比较一次,一共比较n-1次 31 if(max_sum_h<=max_sum) 32 { 33 max_sum_h=max_sum; 34 } 35 //实现环形数组的变化成一维数组 36 t=a[n-1]; 37 for(int i=n-1;i>0;i--) 38 { 39 a[i]=a[i-1]; 40 } 41 a[0]=t; 42 k--; 43 } 44 return max_sum_h; 45 } 46 int main() 47 { 48 int n,star=0,end=0; 49 //实现整型数组的输入 50 cout<<"输入整型数组的长度"<<endl; 51 cin>>n; 52 int *p=new int[n]; 53 cout<<"输入一个整型数组"<<endl; 54 for(int i=0;i<n;i++) 55 { 56 cin>>p[i]; 57 } 58 cout<<"最大子数组和为"<<max_sum1(p,n)<<endl; 59 return 0; 60 }
总结
在一维最大子数组之和的基础上变化成环形数组,需要将一个问题分解成几步,变成我们能处理或掌握的知识解决。