fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. vector<int>getprefixMax(vector<int>&arr){
  4. int n=arr.size();
  5. vector<int>newprefixSum(n+1,0);
  6. int curr=arr[1];
  7. newprefixSum[1]=arr[1];
  8. for(int i=2;i<=n;i++){
  9. curr=max({0,curr+arr[i],arr[i]});
  10. newprefixSum[i]=curr;
  11. }
  12. return newprefixSum;
  13.  
  14. }
  15. vector<int>getsuffixMax(vector<int>&arr){
  16. int n=arr.size();
  17. vector<int>newsuffixSum(n+1,0);
  18. int curr=arr[n];
  19. newsuffixSum[n]=arr[n];
  20. for(int i=n-1;i>0;i--){
  21. curr=max({0,curr+arr[i],arr[i]});
  22. newsuffixSum[i]=curr;
  23. }
  24. return newsuffixSum;
  25.  
  26. }
  27.  
  28. int getMaxSum(vector<int>&arr){
  29. int n=arr.size();
  30. vector<int>prefixMax=getprefixMax(arr);
  31. vector<int>suffixMax=getsuffixMax(arr);
  32.  
  33. vector<int>finalprefixMax(n+2,0);
  34. vector<int>finalsuffixMax(n+2,0);
  35.  
  36. finalprefixMax[1]=prefixMax[1];
  37. for(int i=2;i<=n;i++){
  38. finalprefixMax[i]=max(finalprefixMax[i-1],prefixMax[i]);
  39. }
  40.  
  41. finalsuffixMax[n]=suffixMax[n];
  42. for(int i=n-1;i>0;i--){
  43. finalsuffixMax[i]=max(finalsuffixMax[i+1],suffixMax[i]);
  44. }
  45. int finalMax=0;
  46. for(int i=0;i<=n;i++){
  47. finalMax=max({finalMax,finalprefixMax[i]+finalsuffixMax[i+1]});
  48. }
  49. return finalMax;
  50.  
  51. }
  52.  
  53. int main() {
  54. // your code goes here
  55. int n;
  56. cin>>n;
  57. vector<int>arr(n+1);
  58. for(int i=1;i<=n;i++){
  59. cin>>arr[i];
  60. }
  61. cout<<"The maximum sum of non-overlapping subarrays is:"<<getMaxSum(arr);
  62.  
  63.  
  64. return 0;
  65. }
Success #stdin #stdout 0s 5312KB
stdin
7
1 5 -3 4 -9 9 2
stdout
The maximum sum of non-overlapping subarrays is:18