bingxuan9112

入芽考 maximum subarray應用

Mar 11th, 2019
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.83 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const ll N = 200000,INF = 1e18;
  6.  
  7. ll s[N+1] = {},p[N+1] = {};
  8. ll a[N+1] = {},n,sum,best,has_p,mx;
  9. signed main(){
  10.     cin >> n;
  11.     for(int i=0;i<n;i++)cin>>a[i];
  12.     sum = best = has_p = 0, mx = -INF;
  13.     for(int i=0;i<n;i++){
  14.         if(sum+a[i]<0)sum = 0;
  15.         else sum = sum+a[i];
  16.         p[i] = best = max(best,sum);
  17.         if(a[i]>=0)has_p = 1;
  18.         if(!has_p)p[i] = mx = max(mx,a[i]);
  19.     }
  20.     sum = best = has_p = 0, mx = -INF;
  21.     for(int i=n-1;i>=0;i--){
  22.         if(sum+a[i]<0)sum = 0;
  23.         else sum = sum+a[i];
  24.         s[i] = best = max(best,sum);
  25.         if(a[i]>=0)has_p = 1;
  26.         if(!has_p)s[i] = mx = max(mx,a[i]);
  27.     }
  28.     best = -INF;
  29.     for(int i=1;i<n-1;i++)best = max(best,s[i+1]+p[i-1]);
  30.     cout << best << '\n';
  31. }
Advertisement
Add Comment
Please, Sign In to add comment