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++
/* Dynamic Programming implementation of Maximum Sum Increasing Subsequence (MSIS) problem */ #include <bits/stdc++.h> using namespace std; /* maxSumIS() returns the maximum sum of increasing subsequence in arr[] of size n */ int maxSumIS( int arr[], int n) { int i, j, max = 0; int msis[n]; /* Initialize msis values for all indexes */ for ( i = 0; i < n; i++ ) msis[i] = arr[i]; /* Compute maximum sum values in bottom up manner */ 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]; /* Pick maximum of all msis values */ for ( i = 0; i < n; i++ ) if ( max < msis[i] ) max = msis[i]; return max; } // Driver Code 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; } // This is code is contributed by rathbhupendra |
C
/* Dynamic Programming implementation of Maximum Sum Increasing Subsequence (MSIS) problem */ #include<stdio.h> /* maxSumIS() returns the maximum sum of increasing subsequence in arr[] of size n */ int maxSumIS( int arr[], int n) { int i, j, max = 0; int msis[n]; /* Initialize msis values for all indexes */ for ( i = 0; i < n; i++ ) msis[i] = arr[i]; /* Compute maximum sum values in bottom up manner */ 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]; /* Pick maximum of all msis values */ for ( i = 0; i < n; i++ ) if ( max < msis[i] ) max = msis[i]; return max; } // Driver Code 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
/* Dynamic Programming Java implementation of Maximum Sum Increasing Subsequence (MSIS) problem */ class GFG { /* maxSumIS() returns the maximum sum of increasing subsequence in arr[] of size n */ static int maxSumIS( int arr[], int n) { int i, j, max = 0 ; int msis[] = new int [n]; /* Initialize msis values for all indexes */ for (i = 0 ; i < n; i++) msis[i] = arr[i]; /* Compute maximum sum values in bottom up manner */ 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]; /* Pick maximum of all msis values */ for (i = 0 ; i < n; i++) if (max < msis[i]) max = msis[i]; return max; } // Driver code 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)); } } // This code is contributed // by Rajat Mishra |
Python3
# Dynamic Programming based Python # implementation of Maximum Sum # Increasing Subsequence (MSIS) # problem # maxSumIS() returns the maximum # sum of increasing subsequence # in arr[] of size n def maxSumIS(arr, n): max = 0 msis = [ 0 for x in range (n)] # Initialize msis values # for all indexes for i in range (n): msis[i] = arr[i] # Compute maximum sum # values in bottom up manner 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] # Pick maximum of # all msis values for i in range (n): if max < msis[i]: max = msis[i] return max # Driver Code arr = [ 1 , 101 , 2 , 3 , 100 , 4 , 5 ] n = len (arr) print ( "Sum of maximum sum increasing " + "subsequence is " + str (maxSumIS(arr, n))) # This code is contributed # by Bhavya Jain |
C#
// Dynamic Programming C# implementation // of Maximum Sum Increasing Subsequence // (MSIS) problem using System; class GFG { // maxSumIS() returns the // maximum sum of increasing // subsequence in arr[] of size n static int maxSumIS( int []arr, int n ) { int i, j, max = 0; int []msis = new int [n]; /* Initialize msis values for all indexes */ for ( i = 0; i < n; i++ ) msis[i] = arr[i]; /* Compute maximum sum values in bottom up manner */ 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]; /* Pick maximum of all msis values */ for ( i = 0; i < n; i++ ) if ( max < msis[i] ) max = msis[i]; return max; } // Driver Code 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)); } } // This code is contributed by Sam007 |
PHP
<?php // Dynamic Programming implementation // of Maximum Sum Increasing // Subsequence (MSIS) problem // maxSumIS() returns the maximum // sum of increasing subsequence // in arr[] of size n function maxSumIS( $arr , $n ) { $max = 0; $msis = array ( $n ); // Initialize msis values // for all indexes for ( $i = 0; $i < $n ; $i ++ ) $msis [ $i ] = $arr [ $i ]; // Compute maximum sum values // in bottom up manner 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 ]; // Pick maximum of all msis values for ( $i = 0; $i < $n ; $i ++ ) if ( $max < $msis [ $i ] ) $max = $msis [ $i ]; return $max ; } // Driver Code $arr = array (1, 101, 2, 3, 100, 4, 5); $n = count ( $arr ); echo "Sum of maximum sum increasing subsequence is " .maxSumIS( $arr , $n ); // This code is contributed by Sam007 ?> |
Javascript
<script> // Dynamic Programming implementation // of Maximum Sum Increasing Subsequence // (MSIS) problem // maxSumIS() returns the maximum // sum of increasing subsequence // in arr[] of size n function maxSumIS(arr, n) { let i, j, max = 0; let msis = new Array(n); // Initialize msis values // for all indexes for (i = 0; i < n; i++) msis[i] = arr[i]; // Compute maximum sum values // in bottom up manner 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]; // Pick maximum of // all msis values for (i = 0; i < n; i++) if (max < msis[i]) max = msis[i]; return max; } // Driver Code 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)); // This code is contributed by rishavmahato348 </script> |
Sum of maximum sum increasing subsequence is 106
Time Complexity: O(n^2)
Space Complexity O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!