用c++实现环形数组的最大子数组之和(结对)

结对作业

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 }

 总结

在一维最大子数组之和的基础上变化成环形数组,需要将一个问题分解成几步,变成我们能处理或掌握的知识解决。

 

猜你喜欢

转载自www.cnblogs.com/yinianzs/p/9891357.html
今日推荐