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. if(n==0){
  31. return 0;
  32. }
  33. vector<int>prefixMax=getprefixMax(arr);
  34. vector<int>suffixMax=getsuffixMax(arr);
  35.  
  36. vector<int>finalprefixMax(n+2,0);
  37. vector<int>finalsuffixMax(n+2,0);
  38.  
  39. finalprefixMax[1]=prefixMax[1];
  40. for(int i=2;i<=n;i++){
  41. finalprefixMax[i]=max(finalprefixMax[i-1],prefixMax[i]);
  42. }
  43.  
  44. finalsuffixMax[n]=suffixMax[n];
  45. for(int i=n-1;i>0;i--){
  46. finalsuffixMax[i]=max(finalsuffixMax[i+1],suffixMax[i]);
  47. }
  48. int finalMax=0;
  49. for(int i=0;i<=n;i++){
  50. finalMax=max({finalMax,finalprefixMax[i]+finalsuffixMax[i+1]});
  51. }
  52. return finalMax;
  53.  
  54. }
  55.  
  56. int main() {
  57. // your code goes here
  58. int n;
  59. cin>>n;
  60. vector<int>arr(n+1);
  61. for(int i=1;i<=n;i++){
  62. cin>>arr[i];
  63. }
  64. cout<<"The maximum sum of non-overlapping subarrays is:"<<getMaxSum(arr);
  65.  
  66.  
  67. return 0;
  68. }
Success #stdin #stdout 0.01s 5276KB
stdin
7
1 5 -3 4 -9 9 2
stdout
The maximum sum of non-overlapping subarrays is:18