求数组中最大子数组的和
Posted 20183711pyd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数组中最大子数组的和相关的知识,希望对你有一定的参考价值。
本篇博客介绍第二周课上小测:求数组中最大子数组的和,使用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 }
以上是关于求数组中最大子数组的和的主要内容,如果未能解决你的问题,请参考以下文章