求数组中最大子数组的和

  本篇博客介绍第二周课上小测:求数组中最大子数组的和,使用C++实现。

代码:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5 
 6     int a[100],i,n;
 7     //确定数组长度
 8     cin>>n;
 9     //输入数组元素
10     for(i=1;i<=n;i++)
11         cin>>a[i];
12     //以子数组中的尾数为指针进行判断
13     for(i=2;i<=n;i++)
14     {
15         //如果该数与前一个数相加大于该数,此位置替换为和,证明“并入”子数组
16         if(a[i]+a[i-1]>a[i])
17             a[i]=a[i]+a[i-1];
18     }
19     int ans=-100000;
20     //再次遍历,最大值即为最大子数组的和
21     for(i=1;i<=n;i++)
22         ans=max(ans,a[i]);
23     cout<<ans<<endl;
24     return 0;
25 }

求最大子数组和的要点在于动态规划,只要理解其意就能写出代码。

接下来改变了题目要求,数组变为循环数组,再求出最大子数组的和。解决思路:循环数组需要循环遍历,这里就令输入的长度为n的数组输入两次形成一个长度为2n的新数组,从头开始遍历(实现“循环”),再设置int变量k记录子数组的长度,如果该子数组的长度k>=n,则下一次计算时不进行相加验证操作,而是重新计算(子数组长度无法大于数组长度),最后进行遍历得出最大子数组和。代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5 
 6     int a[100], i, j, n, k = 1;
 7     cin >> n;
 8     //构成2n数组
 9     for (i = 1; i <= n; i++)
10     {
11         cin >> a[i];
12         a[i + n] = a[i];
13     }
14     //计算子数组和
15     for (i = 2; i <= 2*n; i++)
16     {
17         if (k < n)
18         {
19             if (a[i] + a[i - 1] > a[i])
20             {
21                 a[i] = a[i] + a[i - 1];
22                 k++;
23             }
24             //若和不大于该数,证明不能连接成子数组
25             else
26                 k = 1;
27         }
28         //若k>=n,则证明该子数组已经饱和,不能再加
29         else
30         {
31             k = 1;
32             continue;
33         }
34     }
35     int ans = -100000;
36     //遍历求出最大子数组和
37     for (i = 1; i <= 2*n; i++)
38     {
39         if (a[i] > ans)
40             ans = a[i];
41     }
42     cout << ans << endl;
43     return 0;
44 }

猜你喜欢

转载自www.cnblogs.com/20183711PYD/p/12378685.html