给一段数列,(有可能为负数),找出其中一段子数列,使得这段子数列中的所有元素和最大,如果所求的和为负数,请输出0
1.分治思想(时间复杂度为O(n*logn) )
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int max3(int a,int b,int c) { int mid; mid = max(a,b); return max(mid,c); } int sums(const int a[],int l,int r) { int maxlsum,maxrsum; int maxlbsum,maxrbsum; int lbsum,rbsum; if(l == r) if(a[l] > 0) return a[l]; else return 0; int mid = (l+r) >> 1; maxlsum = sums(a,l,mid); maxrsum = sums(a,mid+1,r); maxlbsum = 0,lbsum = 0; for(int i = mid;i >= l;i--) { lbsum += a[i]; if(lbsum > maxlbsum) maxlbsum = lbsum; } maxrbsum = 0,rbsum = 0; for(int i = mid+1;i <= r;i++) { rbsum += a[i]; if(rbsum > maxrbsum) maxrbsum = rbsum; } return max3(maxlsum,maxrsum,maxlbsum+maxrbsum); } int main() { int a[50]; int n; cin >> n; for(int i = 0;i < n;i++) cin >> a[i]; cout << sums(a,0,n-1) << endl; return 0; } 2.在线计算(时间复杂度为O(N) )
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int maxs(const int a[],int n) { int thissum = 0,maxsum = 0; for(int i = 0;i < n;i++) { thissum += a[i]; if(thissum > maxsum) maxsum = thissum; else if(thissum < 0) thissum = 0; } return maxsum; } int main() { int a[50]; int n; cin >> n; for(int i = 0;i < n;i++) cin >> a[i]; cout << maxs(a,n) << endl; return 0; }