Find Maximum Sum Strictly Increasing Subarray

06 Jul, 2022
Given an array of positive integers. Find the maximum sum of strictly increasing subarrays. Note that this problem is different from maximum subarray sum and maximum sum increasing subsequence problems.
Examples: 
Input  : arr[] = {1, 2, 3, 2, 5, 1, 7}Output : 8Explanation :  Some Strictly increasing subarrays are {1, 2, 3} sum = 6, {2, 5} sum = 7, {1, 7} sum 8 Maximum Sum = 8 
Input : arr[] = {1, 2, 2, 4}Output: 6Explanation : Increasing subarray with maximum sum is 6.
A Simple Solution is to generate all possible subarrays, and for every subarray check if subarray is strictly increasing or not. If subarray is strictly increasing, then we calculate sum & update max_sum. Time complexity O(n2).
An efficient solution of this problem take O(n) time. The idea is keep track of maximum sum and current sum. For every element arr[i], if it is greater than arr[i-1], then we add it to current sum. Else arr[i] is starting point of another potential candidate for maximum sum increasing subarray, so we update current sum as array. But before updating current sum, we update maximum sum if required.
Let input array be 'arr[]' and size of array be 'n'

Initialize : 
max_sum = arr[0]
  // because if array size is 1 than it
  // would return that element.
  // used to store the maximum sum 
current_sum = arr[0] // used to compute current sum 

// Traverse array starting from second element
i goes from 1 to n-1

    // Check if it is strictly increasing then we 
    // update current_sum.
    current_sum = current_sum + arr[i]
    max_sum = max(max_sum, current_sum)
    // Also needed for subarray having last element.
    // else strictly increasing subarray breaks and 
    // arr[i] is starting point of next potential
    // subarray
    max_sum = max(max_sum, current_sum)
    current_sum = arr[i]

return max(max_sum, current_sum)    
Below is the implementation of the above idea. 
C++
Java
Python3
C#
PHP
Javascript
// C/C++ program to find the maximum sum of strictly// increasing subarrays#include <iostream>using namespace std; // Returns maximum sum of strictly increasing// subarraysint maxsum_SIS(int arr[], int n){    // Initialize max_sum be 0    int max_sum = arr[0];     // Initialize current sum be arr[0]    int current_sum = arr[0];     // Traverse array elements after first element.    for (int i = 1; i < n; i++)    {        // update current_sum for        // strictly increasing subarray        if (arr[i - 1] < arr[i])        {            current_sum = current_sum + arr[i];            max_sum = max(max_sum, current_sum);        }         else // strictly increasing subarray break        {            // update max_sum and current_sum ;            max_sum = max(max_sum, current_sum);            current_sum = arr[i];        }    }     return max(max_sum, current_sum);} // Driver codeint main(){    int arr[] = { 1, 2, 2, 4 };    int n = sizeof(arr) / sizeof(arr[0]);     cout << "Maximum sum : " << maxsum_SIS(arr, n);    return 0;}
// Java program to find the// maximum sum of strictly increasing subarrays public class GFG {     // Returns maximum sum    // of strictly increasing subarrays    static int maxsum_SIS(int arr[], int n)    {        // Initialize max_sum be 0        int max_sum = arr[0];         // Initialize current sum be arr[0]        int current_sum = arr[0];         // Traverse array elements after first element.        for (int i = 1; i < n; i++)        {            // update current_sum            // for strictly increasing subarray            if (arr[i - 1] < arr[i])            {                current_sum = current_sum + arr[i];                max_sum = Math.max(max_sum, current_sum);            }            else // strictly increasing subarray break            {                // update max_sum and current_sum ;                max_sum = Math.max(max_sum, current_sum);                current_sum = arr[i];            }        }         return Math.max(max_sum, current_sum);    }     // Driver code    public static void main(String[] args)    {        int arr[] = { 1, 2, 2, 4 };        int n = arr.length;        System.out.println("Maximum sum : "                           + maxsum_SIS(arr, n));    }} // This code is contributed by 29AjayKumar
# Python3 program to find the maximum sum of strictly# increasing subarrays # Returns maximum sum of strictly increasing# subarrays  def maxsum_SIS(arr, n):    # Initialize max_sum be 0    max_sum = arr[0]     # Initialize current sum be arr[0]    current_sum = arr[0]     # Traverse array elements after first element.    for i in range(1, n):        # update current_sum for strictly increasing subarray        if (arr[i-1] < arr[i]):            current_sum = current_sum + arr[i]            max_sum = max(max_sum, current_sum)         else:            # strictly increasing subarray break            # update max_sum and current_sum            max_sum = max(max_sum, current_sum)            current_sum = arr[i]     return max(max_sum, current_sum) # Driver code def main():    arr = [1, 2, 2, 4]    n = len(arr)     print("Maximum sum : ", maxsum_SIS(arr, n)),  if __name__ == '__main__':    main() # This code is contributed by 29AjayKumar
// C# program to find the maximum sum of strictly// increasing subarraysusing System;public class GFG {     // Returns maximum sum of strictly increasing    // subarrays    static int maxsum_SIS(int[] arr, int n)    {        // Initialize max_sum be 0        int max_sum = arr[0];         // Initialize current sum be arr[0]        int current_sum = arr[0];         // Traverse array elements after first element.        for (int i = 1; i < n; i++) {            // update current_sum for strictly increasing            // subarray            if (arr[i - 1] < arr[i]) {                current_sum = current_sum + arr[i];                max_sum = Math.Max(max_sum, current_sum);            }            else // strictly increasing subarray break            {                // update max_sum and current_sum ;                max_sum = Math.Max(max_sum, current_sum);                current_sum = arr[i];            }        }         return Math.Max(max_sum, current_sum);    }     // Driver code    public static void Main()    {        int[] arr = { 1, 2, 2, 4 };        int n = arr.Length;        Console.WriteLine("Maximum sum : "                          + maxsum_SIS(arr, n));    }} // This code is contributed by 29AjayKumar
<?php// PHP program to find the maximum sum of// strictly increasing subarrays // Returns maximum sum of strictly// increasing subarraysfunction maxsum_SIS($arr , $n){    // Initialize max_sum be 0    $max_sum = $arr[0];     // Initialize current sum be arr[0]    $current_sum = $arr[0];     // Traverse array elements after    // first element.    for ($i = 1; $i < $n ; $i++)    {        // update current_sum for strictly        // increasing subarray        if ($arr[$i - 1] < $arr[$i]){            $current_sum = $current_sum + $arr[$i];            $max_sum = max($max_sum, $current_sum);    }         else // strictly increasing             // subarray break        {            // update max_sum and current_sum ;            $max_sum = max($max_sum, $current_sum);            $current_sum = $arr[$i];        }    }     return max($max_sum, $current_sum);} // Driver Code$arr = array(1, 2, 2, 4);$n = sizeof($arr); echo "Maximum sum : ",      maxsum_SIS($arr , $n); // This code is contributed by Sachin?>
<script> // Javascript program to find the maximum sum of strictly// increasing subarrays // Returns maximum sum of strictly increasing// subarraysfunction maxsum_SIS(arr, n){    // Initialize max_sum be 0    var max_sum = arr[0];     // Initialize current sum be arr[0]    var current_sum = arr[0];     // Traverse array elements after first element.    for (var i = 1; i < n; i++)    {        // update current_sum for        // strictly increasing subarray        if (arr[i - 1] < arr[i])        {            current_sum = current_sum + arr[i];            max_sum = Math.max(max_sum, current_sum);        }         else // strictly increasing subarray break        {            // update max_sum and current_sum ;            max_sum = Math.max(max_sum, current_sum);            current_sum = arr[i];        }    }     return Math.max(max_sum, current_sum);} // Driver codevar arr = [ 1, 2, 2, 4 ];var n = arr.length;document.write( "Maximum sum : " + maxsum_SIS(arr, n)); // This code is contributed by itsok.</script>
Maximum sum : 6
Time complexity : O(n) Auxiliary Space : O(1)
This article is contributed by Nishant_Singh(Pintu) and Edited by Samraj Singh Solanki (kunwar_samraj_singh) . If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 
29AjayKumar
Sach_Code
Kunwar_Samraj_Singh
itsok
simmytarika5
hardikkoriintern
subarray
subarray-sum
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Data Structures
Search, insert and delete in an unsorted array
Window Sliding Technique
Chocolate Distribution Problem
Move all negative numbers to beginning and positive to end with constant extra space
Find duplicates in O(n) time and O(1) extra space | Set 1
Next Greater Element
What is Data Structure: Types, Classifications and Applications
Count pairs with given sum
Longest Consecutive Subsequence