Maximum sum increasing subsequence from a prefix and a given element after prefix is must

Given an array of n positive integers, write a program to find the maximum sum of increasing subsequence from prefix till ith index and also including a given kth element which is after i, i.e., k > i.
Examples :
Input: arr[] = {1, 101, 2, 3, 100, 4, 5} i-th index = 4 (Element at 4th index is 100) K-th index = 6 (Element at 6th index is 5.)
Output: 11
Explanation:
So we need to calculate the maximum sum of subsequence (1 101 2 3 100 5) such that 5 is necessarily included in the subsequence, so answer is 11 by subsequence (1 2 3 5).Input: arr[] = {1, 101, 2, 3, 100, 4, 5} i-th index = 2 (Element at 2nd index is 2) K-th index = 5 (Element at 5th index is 4.)
Output: 7
Explanation:
So we need to calculate the maximum sum of subsequence (1 101 2 4) such that 4 is necessarily included in the subsequence, so answer is 7 by subsequence (1 2 4).
Prerequisite : Maximum Sum Increasing Subsequence
Naive Approach:
- Construct a new array containing elements till ith index and the kth element.
 - Recursively calculate all the increasing subsequences.
 - Discard all the subsequences not having kth element included.
 - Calculate the maximum sum from the left over subsequences and display it.
 
Time Complexity: O(2n)
Better Approach: Use a dynamic approach to maintain a table dp[][]. The value of dp[i][k] stores the maximum sum of increasing subsequence till ith index and containing the kth element.
C++
// C++ program to find maximum sum increasing// subsequence till i-th index and including// k-th index.#include <bits/stdc++.h>#define ll long long intusing namespace std;ll pre_compute(ll a[], ll n, ll index, ll k){    ll dp[n][n] = { 0 };    // Initializing the first row of the dp[][].    for (int i = 0; i < n; i++) {        if (a[i] > a[0])             dp[0][i] = a[i] + a[0];                else            dp[0][i] = a[i];            }    // Creating the dp[][] matrix.    for (int i = 1; i < n; i++) {        for (int j = 0; j < n; j++) {            if (a[j] > a[i] && j > i) {                if (dp[i - 1][i] + a[j] > dp[i - 1][j])                     dp[i][j] = dp[i - 1][i] + a[j];                                else                    dp[i][j] = dp[i - 1][j];            }            else                dp[i][j] = dp[i - 1][j];                    }    }    // To calculate for i=4 and k=6.    return dp[index][k];}int main(){    ll a[] = { 1, 101, 2, 3, 100, 4, 5 };    ll n = sizeof(a) / sizeof(a[0]);    ll index = 4, k = 6;    printf("%lld", pre_compute(a, n, index, k));    return 0;} | 
Java
// Java program to find maximum sum increasing// subsequence till i-th index and including// k-th index.import java.io.*;class GFG {         static int pre_compute(int a[], int n,                             int index, int k)    {        int dp[][] = new int[n][n];             // Initializing the first row of         // the dp[][].        for (int i = 0; i < n; i++) {            if (a[i] > a[0])                 dp[0][i] = a[i] + a[0];             else                dp[0][i] = a[i];             }             // Creating the dp[][] matrix.        for (int i = 1; i < n; i++)        {            for (int j = 0; j < n; j++)            {                if (a[j] > a[i] && j > i)                {                    if (dp[i - 1][i] + a[j] >                                 dp[i - 1][j])                         dp[i][j] = dp[i - 1][i]                                        + a[j];                             else                        dp[i][j] = dp[i - 1][j];                }                else                    dp[i][j] = dp[i - 1][j];                     }        }             // To calculate for i=4 and k=6.        return dp[index][k];    }         // Driver code    public static void main(String[] args)    {        int a[] = { 1, 101, 2, 3, 100, 4, 5 };        int n = a.length;        int index = 4, k = 6;        System.out.println(                  pre_compute(a, n, index, k));    }}// This code is contributed by Smitha. | 
Python3
# Python3 program to find maximum # sum increasing subsequence till  # i-th index and including k-th index. def pre_compute(a, n, index, k):         dp = [[0 for i in range(n)]              for i in range(n)]                  # Initializing the first     # row of the dp[][]    for i in range(n):        if a[i] > a[0]:            dp[0][i] = a[i] + a[0]        else:            dp[0][i] = a[i]                 # Creating the dp[][] matrix.    for i in range(1, n):        for j in range(n):            if a[j] > a[i] and j > i:                if dp[i - 1][i] + a[j] > dp[i - 1][j]:                    dp[i][j] = dp[i - 1][i] + a[j]                else:                    dp[i][j] = dp[i - 1][j]            else:                dp[i][j] = dp[i - 1][j]                     # To calculate for i=4 and k=6.     return dp[index][k]# Driver codea = [1, 101, 2, 3, 100, 4, 5 ]n = len(a)index = 4k = 6print(pre_compute(a, n, index, k))# This code is contributed# by sahilshelangia | 
C#
// C# program to find maximum // sum increasing subsequence // till i-th index and including// k-th index.using System;class GFG{    static int pre_compute(int []a, int n,                           int index, int k)    {    int [,]dp = new int[n, n];    // Initializing the first     // row of the dp[][].    for (int i = 0; i < n; i++)     {        if (a[i] > a[0])             dp[0, i] = a[i] + a[0];         else            dp[0, i] = a[i];     }    // Creating the dp[][] matrix.    for (int i = 1; i < n; i++)    {        for (int j = 0; j < n; j++)        {            if (a[j] > a[i] && j > i)            {                if (dp[i - 1, i] + a[j] >                            dp[i - 1, j])                     dp[i, j] = dp[i - 1, i] +                                        a[j];                     else                    dp[i, j] = dp[i - 1, j];            }            else                dp[i, j] = dp[i - 1, j];                 }    }    // To calculate for i=4 and k=6.    return dp[index, k];}// Driver codestatic public void Main (){    int []a = {1, 101, 2,                3, 100, 4, 5};    int n = a.Length;    int index = 4, k = 6;    Console.WriteLine(pre_compute(a, n,                                   index, k));}}// This code is contributed by @ajit | 
PHP
<?php // PHP program to find maximum sum increasing// subsequence till i-th index and including// k-th index.function pre_compute(&$a, $n, $index, $k){    $dp = array_fill(0, $n,           array_fill(0, $n, NULL));    // Initializing the first row of the dp[][].    for ($i = 0; $i < $n; $i++)     {        if ($a[$i] > $a[0])             $dp[0][$i] = $a[$i] + $a[0];             else            $dp[0][$i] = $a[$i];         }    // Creating the dp[][] matrix.    for ($i = 1; $i < $n; $i++)    {        for ($j = 0; $j < $n; $j++)         {            if ($a[$j] > $a[$i] && $j > $i)            {                if (($dp[$i - 1][$i] + $a[$j]) >                                  $dp[$i - 1][$j])                     $dp[$i][$j] = $dp[$i - 1][$i] +                                            $a[$j];                             else                    $dp[$i][$j] = $dp[$i - 1][$j];            }            else                $dp[$i][$j] = $dp[$i - 1][$j];                 }    }    // To calculate for i=4 and k=6.    return $dp[$index][$k];}// Driver Code$a = array( 1, 101, 2, 3, 100, 4, 5 );$n = sizeof($a);$index = 4;$k = 6;echo pre_compute($a, $n, $index, $k);// This code is contributed by ita_c?> | 
Javascript
<script>// Javascript program to find maximum// sum increasing subsequence till // i-th index and including k-th index.function pre_compute(a, n, index, k){    let dp = new Array(n);    for(let i = 0; i < n; i++)    {        dp[i] = new Array(n);        for(let j = 0; j < n; j++)        {            dp[i][j] = 0;        }    }      // Initializing the first row of    // the dp[][].    for(let i = 0; i < n; i++)    {        if (a[i] > a[0])            dp[0][i] = a[i] + a[0];        else            dp[0][i] = a[i];        }      // Creating the dp[][] matrix.    for(let i = 1; i < n; i++)    {        for(let j = 0; j < n; j++)        {            if (a[j] > a[i] && j > i)            {                if (dp[i - 1][i] + a[j] >                     dp[i - 1][j])                    dp[i][j] = dp[i - 1][i] +                                 a[j];                        else                    dp[i][j] = dp[i - 1][j];            }            else                dp[i][j] = dp[i - 1][j];                }    }      // To calculate for i=4 and k=6.    return dp[index][k];}// Driver codelet a = [ 1, 101, 2, 3, 100, 4, 5 ];let n = a.length;let index = 4, k = 6;document.write(pre_compute(a, n, index, k));// This code is contributed by mukesh07 </script> | 
11
Time Complexity: O(n2) 
Auxiliary Space: O(n2)
Efficient approach: This problem is basically finding of maximum sum of increasing sub-sequence up to the given index i that all the elements of the sub-sequence is less than the kth (index) element or arr[k]. Hence, find the Maximum Sum Increasing Subsequence.
For example: arr[] = {1, 101, 2, 3, 100, 4, 5}, index = 4; k = 6;
Now, we need to just find the max sum sub-sequence from the array till index 4 given that all the elements of that sub-sequence is less that arr[k] which is 5. Now, iterating through the array.
For i = 0; as 1 < 5; max increasing sub-sequence {1}, max = 1.
For i = 1; as 101 > 5; skip this entry. Max increasing sub-sequence {1}, max = 1.
For i = 2; as 2 < 5; max increasing sub-sequence {1, 2}, max = 3.
For i = 3; as 3 < 5; max increasing sub-sequence {1, 2, 3}, max = 6.
For i = 4; as 100 > 5; skip this entry. Max increasing sub-sequence {1, 2, 3}, max = 6.
as index = 4; hence stop here and answer will be max + a[k] = 6 + 5 = 11.
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>#include <limits.h>using namespace std;// Function to find the// maximum of two numbersint max(int a, int b){    if (a > b) {        return a;    }    return b;}// Function to find the sumint pre_compute(int a[], int n, int index, int k){    // Base case    if (index >= k) {        return -1;    }    // Initialize the dp table    int dp[index] = { 0 };    int i;    // Initialize the dp array with    // corresponding array index value    for (i = 0; i <= index; i++) {        dp[i] = a[i];    }    int maxi = INT_MIN;    for (i = 0; i <= index; i++) {        // Only include values        // which are less than a[k]        if (a[i] >= a[k]) {            continue;        }        for (int j = 0; j < i; j++) {            // Check if a[i] is            // greater than a[j]            if (a[i] > a[j]) {                dp[i] = dp[j] + a[i];            }            // Update maxi            maxi = max(maxi, dp[i]);        }    }       // Incase all the elements in    // the array upto ith index    // are greater or equal to a[k]    if (maxi == INT_MIN) {        return a[k];    }    return maxi + a[k];    // Contributed by Mainak Dutta}// Driver codeint main(){    int a[] = { 1, 101, 2, 3, 100, 4, 5 };    int n = sizeof(a) / sizeof(a[0]);    int index = 4, k = 6;    // Function call    printf("%d", pre_compute(a, n, index, k));    return 0;} | 
Java
// Java program for the above approachimport java.io.*;class GFG{     // Function to find the// maximum of two numbersstatic int max(int a, int b){    if (a > b)     {        return a;    }    return b;}  // Function to find the sumstatic int pre_compute(int a[], int n,                        int index, int k){         // Base case    if (index >= k)     {        return -1;    }         // Initialize the dp table    int[] dp = new int[index + 1];      int i;      // Initialize the dp array with    // corresponding array index value    for(i = 0; i <= index; i++)     {        dp[i] = a[i];    }      int maxi = Integer.MIN_VALUE;      for(i = 0; i <= index; i++)     {                 // Only include values        // which are less than a[k]        if (a[i] >= a[k])         {            continue;        }          for(int j = 0; j < i; j++)         {                         // Check if a[i] is            // greater than a[j]            if (a[i] > a[j])            {                dp[i] = dp[j] + a[i];            }              // Update maxi            maxi = max(maxi, dp[i]);        }    }         // Incase all the elements in    // the array upto ith index    // are greater or equal to a[k]    if (maxi == Integer.MIN_VALUE)     {        return a[k];    }    return maxi + a[k];}  // Driver codepublic static void main (String[] args){    int a[] = { 1, 101, 2, 3, 100, 4, 5 };    int n = a.length;    int index = 4, k = 6;         System.out.println(pre_compute(a, n, index, k));}}// This code is contributed by rag2127 | 
Python3
# Python3 program for the above approach# Function to find the sumdef pre_compute(a, n, index, k):         # Base case    if (index >= k):        return -1             # Initialize the dp table    dp = [0 for i in range(index)]    # Initialize the dp array with    # corresponding array index value    for i in range(index):        dp[i] = a[i]    maxi = -float('inf')    for i in range(index):                 # Only include values        # which are less than a[k]        if (a[i] >= a[k]):            continue        for j in range(i):                         # Check if a[i] is            # greater than a[j]            if (a[i] > a[j]):                dp[i] = dp[j] + a[i]                             # Update maxi            maxi = max(maxi, dp[i])       # Incase all the elements in    # the array upto ith index    # are greater or equal to a[k]    if (maxi == -float('inf')):        return a[k]             return maxi + a[k]# Driver codea = [ 1, 101, 2, 3, 100, 4, 5 ]n = len(a)index = 4k = 6# Function callprint(pre_compute(a, n, index, k))# This code is contributed by rohitsingh07052 | 
C#
// C# program for the above approachusing System;class GFG{// Function to find the// maximum of two numbersstatic int max(int a, int b){    if (a > b)     {        return a;    }    return b;}   // Function to find the sumstatic int pre_compute(int[] a, int n,                        int index, int k){         // Base case    if (index >= k)     {        return -1;    }          // Initialize the dp table    int[] dp = new int[index + 1];       int i;       // Initialize the dp array with    // corresponding array index value    for(i = 0; i <= index; i++)     {        dp[i] = a[i];    }       int maxi = Int32.MinValue;       for(i = 0; i <= index; i++)     {                  // Only include values        // which are less than a[k]        if (a[i] >= a[k])         {            continue;        }           for(int j = 0; j < i; j++)         {                          // Check if a[i] is            // greater than a[j]            if (a[i] > a[j])            {                dp[i] = dp[j] + a[i];            }               // Update maxi            maxi = Math.Max(maxi, dp[i]);        }    }          // Incase all the elements in    // the array upto ith index    // are greater or equal to a[k]    if (maxi == Int32.MinValue)     {        return a[k];    }    return maxi + a[k];}   // Driver codestatic public void Main(){    int[] a = { 1, 101, 2, 3, 100, 4, 5 };    int n = a.Length;    int index = 4, k = 6;      Console.WriteLine(pre_compute(a, n, index, k));}}// This code is contributed by avanitrachhadiya2155 | 
Javascript
<script>// Javascript program for the above approach// Function to find the// maximum of two numbersfunction max(a, b){    if (a > b)    {        return a;    }    return b;}// Function to find the sumfunction pre_compute(a, n, index, k){    // Base case    if (index >= k)    {        return -1;    }    // Initialize the dp table    let dp = new Array(index + 1);    dp.fill(0);    let i;    // Initialize the dp array with    // corresponding array index value    for(i = 0; i <= index; i++)    {        dp[i] = a[i];    }    let maxi = Number.MIN_VALUE;    for(i = 0; i <= index; i++)    {        // Only include values        // which are less than a[k]        if (a[i] >= a[k])        {            continue;        }        for(let j = 0; j < i; j++)        {            // Check if a[i] is            // greater than a[j]            if (a[i] > a[j])            {                dp[i] = dp[j] + a[i];            }            // Update maxi            maxi = Math.max(maxi, dp[i]);        }    }    // Incase all the elements in    // the array upto ith index    // are greater or equal to a[k]    if (maxi == Number.MIN_VALUE)    {        return a[k];    }    return maxi + a[k];}// Driver codelet a = [ 1, 101, 2, 3, 100, 4, 5 ];let n = a.length;let index = 4, k = 6;document.write(pre_compute(a, n, index, k));// This code is contributed by divyeshrabadiya07</script> | 
11
Time Complexity: O( index2 ) 
Auxiliary Space: O( index )
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
				
					

