Monday, June 20, 2016

Longest Common Increasing Subsequence (LCS + LIS) - GeeksforGeeks

Longest Common Increasing Subsequence (LCS + LIS) - GeeksforGeeks
Given two arrays, find length of the longest common increasing subsequence [LCIS] and print one of such sequences (multiple sequences may exist)
Suppose we consider two arrays – arr1[] = {3, 4, 9, 1} and arr2[] = {5, 3, 8, 9, 10, 2, 1}
Our answer would be {3, 9} as this is the longest common subsequence which is increasing also.

The idea is to use dynamic programming here as well. We store the longest common increasing sub-sequence ending at each index of arr2[]. We create an auxiliary array table[] such that table[j] stores length of LCIS ending with arr2[j]. At the end, we return maximum value from this table. For filling values in this table, we traverse all elements of arr1[] and for every element arr1[i], we traverse all elements of arr2[]. If we find a match, we update table[j] with length of current LCIS. To maintain current LCIS, we keep checking valid table[j] values.

Time Complexity : O(m*n)Auxiliary Space : O(m)

intLCIS(intarr1[], intn, intarr2[], intm)

{

// table[j] is going to store length of LCIS

// ending with arr2[j]. We initialize it as 0,

inttable[m];

for(intj=0; j<m; j++)

table[j] = 0;

// Traverse all elements of arr1[]

for(inti=0; i<n; i++)

{

// Initialize current length of LCIS

intcurrent = 0;

// For each element of arr1[], trvarse all

// elements of arr2[].

for(intj=0; j<m; j++)

{

// If both the array have same elements.

// Note that we don't break the loop here.

if(arr1[i] == arr2[j])

if(current + 1 > table[j])

table[j] = current + 1;

/* Now seek for previous smaller common

element for current element of arr1 */

if(arr1[i] > arr2[j])

if(table[j] > current)

current = table[j];

}

}

// The maximum value in table[] is out result

intresult = 0;

for(inti=0; i<m; i++)

if(table[i] > result)

result = table[i];

returnresult;

}

How to print a LCIS?To print the longest common increasing subsequence we keep track of the parent of each element in the longest common increasing subsequence.