DP #25. Maximum Sum Increasing Subsequence - mbhushan/dynpro GitHub Wiki

(25). Maximum Sum Increasing Subsequence

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 intgers 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
Formula:

if (A[i] < A[j]) {
    T[j] = T[i] + A[j]
    Parent[j] = i;
}
0 1 2 3 4 5 6
4 6 1 3 8 4 6
MSIS0 4 6 1 3 8 4 6
Parent0 -1 -1 -1 -1 -1 -1 -1
MSIS1 4 10 1 3 12 4 6
Parent1 -1 0 -1 -1 0 -1 0
MSIS2 4 10 1 3 18 4 6
Parent2 -1 0 -1 -1 1 -1 0
MSIS3 4 10 1 4 18 5 7
Parent3 -1 0 -1 2 1 2 2
MSIS4 4 10 1 4 18 8 10
Parent4 -1 0 -1 2 1 3 3
MSIS5 4 10 1 4 18 8 10
Parent5 -1 0 -1 2 1 3 3
MSIS6 4 10 1 4 18 (ans) 8 14
Parent6 -1 0 -1 2 1 3 5
seq -> 4 6 8
index 0 1 4
public int maxSumSubsequence(int [] A) {
		if (A == null) {
			return -1;
		}
		if (A.length < 1) {
			return -1;
		}
		int len = A.length;
		int [] T = new int[len];
		
		for (int i = 0; i < T.length; i++) {
                       T[i] = A[i];
                }
		
		for(int i=1; i<len; i++) {
			for (int j=0; j<i; j++) {
				if (A[j] < A[i]) {
					T[i] = Math.max(T[i], T[j] + A[i]);
				}
			}
		}
		
		int max = Integer.MIN_VALUE;
		for (Integer x: T) {
			if (x > max) {
				max = x;
			}
		}
		return  max;
	}

Max Sum Subsequence

  • Time Complexity: O(n^2)
  • Space Complexity: O(n)