Maximum sum alternating subsequence
Last Updated :
11 Sep, 2023
Given an array, the task is to find sum of maximum sum alternating subsequence starting with first element. Here alternating sequence means first decreasing, then increasing, then decreasing, … For example 10, 5, 14, 3 is an alternating sequence.
Note that the reverse type of sequence (increasing – decreasing – increasing -…) is not considered alternating here.
Examples:
Input : arr[] = {4, 3, 8, 5, 3, 8}
Output : 28
Explanation:
The alternating subsequence (starting with first element)
that has above maximum sum is {4, 3, 8, 5, 8}
Input : arr[] = {4, 8, 2, 5, 6, 8}
Output : 14
The alternating subsequence (starting with first element)
that has above maximum sum is {4, 2, 8}
This problem is similar to Longest Increasing Subsequence (LIS) problem. and can be solved using Dynamic Programming.
Create two empty array that store result of maximum
sum of alternate sub-sequence
inc[] : inc[i] stores results of maximum sum alternating
subsequence ending with arr[i] such that arr[i]
is greater than previous element of the subsequence
dec[] : dec[i] stores results of maximum sum alternating
subsequence ending with arr[i] such that arr[i]
is less than previous element of the subsequence
Include first element of 'arr' in both inc[] and dec[]
inc[0] = dec[0] = arr[0]
// Maintain a flag i.e. it will makes the greater
// elements count only if the first decreasing element
// is counted.
flag = 0
Traversal two loops
i goes from 1 to n-1
j goes 0 to i-1
IF arr[j] > arr[i]
dec[i] = max(dec[i], inc[j] + arr[i])
// Denotes first decreasing is found
flag = 1
ELSE IF arr[j] < arr[i] && flag == 1
inc[i] = max(inc[i], dec[j]+arr[i]);
Final Last Find maximum value inc[] and dec[] .
Below is implementation of above idea.
Note:- For the case where the first element of the array is the smallest element in the array. The output will be the first element only. This is an edge case that need to be checked. Taking a variable and initializing it with the first value of the array and then comparing it with other values will find the min. Check if the min is equal to arr[0]. If it is true then arr[0] is to be returned, because there is no decreasing step available to find an alternating subsequence.
C++
#include <bits/stdc++.h>
using namespace std;
int maxAlternateSum( int arr[], int n)
{
if (n == 1)
return arr[0];
int min = arr[0];
for ( int i = 1; i < n; i++) {
if (min > arr[i])
min = arr[i];
}
if (min == arr[0]) {
return arr[0];
}
int dec[n];
memset (dec, 0, sizeof (dec));
int inc[n];
memset (inc, 0, sizeof (inc));
dec[0] = inc[0] = arr[0];
int flag = 0;
for ( int i = 1; i < n; i++) {
for ( int j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
dec[i] = max(dec[i], inc[j] + arr[i]);
flag = 1;
}
else if (arr[j] < arr[i] && flag == 1)
inc[i] = max(inc[i], dec[j] + arr[i]);
}
}
int result = INT_MIN;
for ( int i = 0; i < n; i++) {
if (result < inc[i])
result = inc[i];
if (result < dec[i])
result = dec[i];
}
return result;
}
int main()
{
int arr[] = { 8, 2, 3, 5, 7, 9, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Maximum sum = " << maxAlternateSum(arr, n)
<< endl;
return 0;
}
|
Java
public class GFG {
static int maxAlternateSum( int arr[], int n)
{
if (n == 1 )
return arr[ 0 ];
int min = arr[ 0 ];
for ( int i = 1 ; i < n; i++) {
if (min > arr[i])
min = arr[i];
}
if (min == arr[ 0 ]) {
return arr[ 0 ];
}
int dec[] = new int [n];
int inc[] = new int [n];
dec[ 0 ] = inc[ 0 ] = arr[ 0 ];
int flag = 0 ;
for ( int i = 1 ; i < n; i++) {
for ( int j = 0 ; j < i; j++) {
if (arr[j] > arr[i]) {
dec[i]
= Math.max(dec[i], inc[j] + arr[i]);
flag = 1 ;
}
else if (arr[j] < arr[i] && flag == 1 )
inc[i]
= Math.max(inc[i], dec[j] + arr[i]);
}
}
int result = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++) {
if (result < inc[i])
result = inc[i];
if (result < dec[i])
result = dec[i];
}
return result;
}
public static void main(String[] args)
{
int arr[] = { 8 , 2 , 3 , 5 , 7 , 9 , 10 };
System.out.println(
"Maximum sum = "
+ maxAlternateSum(arr, arr.length));
}
}
|
Python3
def maxAlternateSum(arr, n):
if (n = = 1 ):
return arr[ 0 ]
min = arr[ 0 ]
for i in range ( 1 , n):
if ( min > arr[i]):
min = arr[i]
if (arr[ 0 ] = = min ):
return arr[ 0 ]
dec = [ 0 for i in range (n + 1 )]
inc = [ 0 for i in range (n + 1 )]
dec[ 0 ] = inc[ 0 ] = arr[ 0 ]
flag = 0
for i in range ( 1 , n):
for j in range (i):
if (arr[j] > arr[i]):
dec[i] = max (dec[i], inc[j] + arr[i])
flag = 1
else if (arr[j] < arr[i] and flag = = 1 ):
inc[i] = max (inc[i], dec[j] + arr[i])
result = - 2147483648
for i in range (n):
if (result < inc[i]):
result = inc[i]
if (result < dec[i]):
result = dec[i]
return result
arr = [ 8 , 2 , 3 , 5 , 7 , 9 , 10 ]
n = len (arr)
print ( "Maximum sum = " ,
maxAlternateSum(arr, n))
|
C#
using System;
class GFG {
static int maxAlternateSum( int [] arr, int n)
{
if (n == 1)
return arr[0];
int min = arr[0];
for ( int i = 1; i < n; i++) {
if (min > arr[i])
min = arr[i];
}
if (min == arr[0]) {
return arr[0];
}
int [] dec = new int [n];
int [] inc = new int [n];
dec[0] = inc[0] = arr[0];
int flag = 0;
for ( int i = 1; i < n; i++) {
for ( int j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
dec[i]
= Math.Max(dec[i], inc[j] + arr[i]);
flag = 1;
}
else if (arr[j] < arr[i] && flag == 1)
inc[i]
= Math.Max(inc[i], dec[j] + arr[i]);
}
}
int result = int .MinValue;
for ( int i = 0; i < n; i++) {
if (result < inc[i])
result = inc[i];
if (result < dec[i])
result = dec[i];
}
return result;
}
public static void Main()
{
int [] arr = { 8, 2, 3, 5, 7, 9, 10 };
Console.Write( "Maximum sum = "
+ maxAlternateSum(arr, arr.Length));
}
}
|
PHP
<?php
function maxAlternateSum( $arr , $n )
{
if ( $n == 1)
return $arr [0];
$min = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
{ $min = max( $min , $arr [ $i ]);}
if ( $arr [0]== $min )
return $arr [0];
$dec = array_fill (0, $n , 0);
$inc = array_fill (0, $n , 0);
$dec [0] = $inc [0] = $arr [0];
$flag = 0;
for ( $i = 1; $i < $n ; $i ++)
{
for ( $j = 0; $j < $i ; $j ++)
{
if ( $arr [ $j ] > $arr [ $i ])
{
$dec [ $i ] = max( $dec [ $i ], $inc [ $j ] +
$arr [ $i ]);
$flag = 1;
}
else if ( $arr [ $j ] < $arr [ $i ] && $flag == 1)
$inc [ $i ] = max( $inc [ $i ], $dec [ $j ] +
$arr [ $i ]);
}
}
$result = -(PHP_INT_MAX - 1);
for ( $i = 0 ; $i < $n ; $i ++)
{
if ( $result < $inc [ $i ])
$result = $inc [ $i ];
if ( $result < $dec [ $i ])
$result = $dec [ $i ];
}
return $result ;
}
$arr = array (8, 2, 3, 5, 7, 9, 10);
$n = sizeof( $arr );
echo "Maximum sum = " ,
maxAlternateSum( $arr , $n );
?>
|
Javascript
<script>
function maxAlternateSum(arr, n)
{
if (n == 1)
return arr[0];
int min = arr[0];
for (int i=1; i<n; i++){
if (min>arr[i])
min = arr[i];
}
if (min==arr[0]){
return arr[0];
}
let dec = new Array(n);
dec.fill(0);
let inc = new Array(n);
inc.fill(0);
dec[0] = inc[0] = arr[0];
let flag = 0 ;
for (let i=1; i<n; i++)
{
for (let j=0; j<i; j++)
{
if (arr[j] > arr[i])
{
dec[i] = Math.max(dec[i], inc[j]+arr[i]);
flag = 1;
}
else if (arr[j] < arr[i] && flag == 1)
inc[i] = Math.max(inc[i], dec[j]+arr[i]);
}
}
let result = Number.MIN_VALUE;
for (let i = 0 ; i < n; i++)
{
if (result < inc[i])
result = inc[i];
if (result < dec[i])
result = dec[i];
}
return result;
}
let arr = [8, 2, 3, 5, 7, 9, 10];
document.write( "Maximum sum = " +
maxAlternateSum(arr , arr.length));
</script>
|
Time Complexity : O(n2)
Auxiliary Space : O(n)
Share your thoughts in the comments
Please Login to comment...