Given an array of n positive integers. Write a program to find the sum of maximum sum subsequence of the given array such that the integers in the subsequence are sorted in increasing order. For example, if input is {1, 101, 2, 3, 100, 4, 5}, then output should be 106 (1 + 2 + 3 + 100), if the input array is {3, 4, 5, 10}, then output should be 22 (3 + 4 + 5 + 10) and if the input array is {10, 5, 4, 3}, then output should be 10
Solution: This problem is a variation of the standard Longest Increasing Subsequence (LIS) problem. We need a slight change in the Dynamic Programming solution of LIS problem. All we need to change is to use sum as a criteria instead of a length of increasing subsequence.
Following are the Dynamic Programming solution to the problem :
C++
#include <bits/stdc++.h>
using namespace std;
int maxSumIS( int arr[], int n)
{
int i, j, max = 0;
int msis[n];
for ( i = 0; i < n; i++ )
msis[i] = arr[i];
for ( i = 1; i < n; i++ )
for ( j = 0; j < i; j++ )
if (arr[i] > arr[j] &&
msis[i] < msis[j] + arr[i])
msis[i] = msis[j] + arr[i];
for ( i = 0; i < n; i++ )
if ( max < msis[i] )
max = msis[i];
return max;
}
int main()
{
int arr[] = {1, 101, 2, 3, 100, 4, 5};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << "Sum of maximum sum increasing "
"subsequence is " << maxSumIS( arr, n ) << endl;
return 0;
}
|
C
#include<stdio.h>
int maxSumIS( int arr[], int n)
{
int i, j, max = 0;
int msis[n];
for ( i = 0; i < n; i++ )
msis[i] = arr[i];
for ( i = 1; i < n; i++ )
for ( j = 0; j < i; j++ )
if (arr[i] > arr[j] &&
msis[i] < msis[j] + arr[i])
msis[i] = msis[j] + arr[i];
for ( i = 0; i < n; i++ )
if ( max < msis[i] )
max = msis[i];
return max;
}
int main()
{
int arr[] = {1, 101, 2, 3, 100, 4, 5};
int n = sizeof (arr)/ sizeof (arr[0]);
printf ( "Sum of maximum sum increasing "
"subsequence is %d\n" ,
maxSumIS( arr, n ) );
return 0;
}
|
Java
class GFG
{
static int maxSumIS( int arr[], int n)
{
int i, j, max = 0 ;
int msis[] = new int [n];
for (i = 0 ; i < n; i++)
msis[i] = arr[i];
for (i = 1 ; i < n; i++)
for (j = 0 ; j < i; j++)
if (arr[i] > arr[j] &&
msis[i] < msis[j] + arr[i])
msis[i] = msis[j] + arr[i];
for (i = 0 ; i < n; i++)
if (max < msis[i])
max = msis[i];
return max;
}
public static void main(String args[])
{
int arr[] = new int []{ 1 , 101 , 2 , 3 , 100 , 4 , 5 };
int n = arr.length;
System.out.println( "Sum of maximum sum " +
"increasing subsequence is " +
maxSumIS(arr, n));
}
}
|
Python3
def maxSumIS(arr, n):
max = 0
msis = [ 0 for x in range (n)]
for i in range (n):
msis[i] = arr[i]
for i in range ( 1 , n):
for j in range (i):
if (arr[i] > arr[j] and
msis[i] < msis[j] + arr[i]):
msis[i] = msis[j] + arr[i]
for i in range (n):
if max < msis[i]:
max = msis[i]
return max
arr = [ 1 , 101 , 2 , 3 , 100 , 4 , 5 ]
n = len (arr)
print ( "Sum of maximum sum increasing " +
"subsequence is " +
str (maxSumIS(arr, n)))
|
C#
using System;
class GFG {
static int maxSumIS( int []arr, int n )
{
int i, j, max = 0;
int []msis = new int [n];
for ( i = 0; i < n; i++ )
msis[i] = arr[i];
for ( i = 1; i < n; i++ )
for ( j = 0; j < i; j++ )
if ( arr[i] > arr[j] &&
msis[i] < msis[j] + arr[i])
msis[i] = msis[j] + arr[i];
for ( i = 0; i < n; i++ )
if ( max < msis[i] )
max = msis[i];
return max;
}
public static void Main()
{
int []arr = new int []{1, 101, 2, 3, 100, 4, 5};
int n = arr.Length;
Console.WriteLine( "Sum of maximum sum increasing " +
" subsequence is " +
maxSumIS(arr, n));
}
}
|
PHP
<?php
function maxSumIS( $arr , $n )
{
$max = 0;
$msis = array ( $n );
for ( $i = 0; $i < $n ; $i ++ )
$msis [ $i ] = $arr [ $i ];
for ( $i = 1; $i < $n ; $i ++)
for ( $j = 0; $j < $i ; $j ++)
if ( $arr [ $i ] > $arr [ $j ] &&
$msis [ $i ] < $msis [ $j ] + $arr [ $i ])
$msis [ $i ] = $msis [ $j ] + $arr [ $i ];
for ( $i = 0; $i < $n ; $i ++ )
if ( $max < $msis [ $i ] )
$max = $msis [ $i ];
return $max ;
}
$arr = array (1, 101, 2, 3, 100, 4, 5);
$n = count ( $arr );
echo "Sum of maximum sum increasing subsequence is "
.maxSumIS( $arr , $n );
?>
|
Javascript
<script>
function maxSumIS(arr, n)
{
let i, j, max = 0;
let msis = new Array(n);
for (i = 0; i < n; i++)
msis[i] = arr[i];
for (i = 1; i < n; i++)
for (j = 0; j < i; j++)
if (arr[i] > arr[j] &&
msis[i] < msis[j] + arr[i])
msis[i] = msis[j] + arr[i];
for (i = 0; i < n; i++)
if (max < msis[i])
max = msis[i];
return max;
}
let arr = [ 1, 101, 2, 3, 100, 4, 5 ];
let n = arr.length;
document.write( "Sum of maximum sum increasing " +
"subsequence is " + maxSumIS(arr, n));
</script>
|
OutputSum of maximum sum increasing subsequence is 106
Time Complexity: O(n^2)
Space Complexity O(n)