0% found this document useful (0 votes)
303 views

Longest Common Increasing Subsequence

The document discusses finding the longest common increasing subsequence (LCIS) between two arrays. It presents an algorithm that uses dynamic programming to store the length of the LCIS ending at each index of the second array in an auxiliary table. It traverses the first array and updates the table if a matching element is found in the second array that increases the LCIS length. The maximum value in the table is returned as the LCIS length. It also describes how to print the LCIS by tracking parent indices. The time complexity is O(m*n) and auxiliary space is O(m).

Uploaded by

aditya gair
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
303 views

Longest Common Increasing Subsequence

The document discusses finding the longest common increasing subsequence (LCIS) between two arrays. It presents an algorithm that uses dynamic programming to store the length of the LCIS ending at each index of the second array in an auxiliary table. It traverses the first array and updates the table if a matching element is found in the second array that increases the LCIS length. The maximum value in the table is returned as the LCIS length. It also describes how to print the LCIS by tracking parent indices. The time complexity is O(m*n) and auxiliary space is O(m).

Uploaded by

aditya gair
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 7

Longest Common Increasing Subsequence (LCS + LIS)

Prerequisites : LCS, LIS


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.
We strongly recommend that you click here and practice it, before
moving on to the solution.
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.
Below is C++ program to find length of LCIS.
// A C++ Program to find length of the Longest Common
// Increasing Subsequence (LCIS)
#include<bits/stdc++.h>
using namespace std;

// Returns the length and the LCIS of two


// arrays arr1[0..n-1] and arr2[0..m-1]
int LCIS(int arr1[], int n, int arr2[], int m)
{
// table[j] is going to store length of LCIS
// ending with arr2[j]. We initialize it as 0,
int table[m];
for (int j=0; j<m; j++)
table[j] = 0;

// Traverse all elements of arr1[]


for (int i=0; i<n; i++)
{
// Initialize current length of LCIS
int current = 0;

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


// elements of arr2[].
for (int j=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


int result = 0;
for (int i=0; i<m; i++)

if (table[i] > result)


result = table[i];

return result;
}

/* Driver program to test above function */


int main()
{
int arr1[] = {3, 4, 9, 1};
int arr2[] = {5, 3, 8, 9, 10, 2, 1};

int n = sizeof(arr1)/sizeof(arr1[0]);
int m = sizeof(arr2)/sizeof(arr2[0]);

cout << "Length of LCIS is "


<< LCIS(arr1, n, arr2, m);
return (0);
}
Output :
Length of LCIS is 2
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.
// A C++ Program to find length of the Longest Common
// Increasing Subsequence (LCIS)
#include<bits/stdc++.h>
using namespace std;

// Returns the length and the LCIS of two


// arrays arr1[0..n-1] and arr2[0..m-1] and
// prints LCIS
int LCIS(int arr1[], int n, int arr2[], int m)
{
// table[j] is going to store length of LCIS
// ending with arr2[j]. We initialize it as 0,
int table[m], parent[m];
for (int j=0; j<m; j++)
table[j] = 0;

// Traverse all elements of arr1[]


for (int i=0; i<n; i++)
{
// Initialize current length of LCIS
int current = 0, last = -1;

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


// elements of arr2[].
for (int j=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;
parent[j] = last;
}
}

/* Now seek for previous smaller common


element for current element of arr1 */
if (arr1[i] > arr2[j])
{
if (table[j] > current)
{
current = table[j];
last = j;
}
}
}
}

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


int result = 0, index = -1;
for (int i=0; i<m; i++)
{
if (table[i] > result)
{
result = table[i];
index = i;
}
}

// LCIS is going to store elements of LCIS


int lcis[result];
for (int i=0; index != -1; i++)
{
lcis[i] = arr2[index];
index = parent[index];
}

cout << "The LCIS is : ";


for (int i=result-1; i>=0; i--)
printf ("%d ", lcis[i]);

return result;
}

/* Driver program to test above function */


int main()
{
int arr1[] = {3, 4, 9, 1};
int arr2[] = {5, 3, 8, 9, 10, 2, 1};

int n = sizeof(arr1)/sizeof(arr1[0]);
int m = sizeof(arr2)/sizeof(arr2[0]);

cout << "\nLength of LCIS is "


<< LCIS(arr1, n, arr2, m);
return (0);

}
Output :
The LCIS is : 3 9
Length of LCIS is 2
Time Complexity : O(m*n)
Auxiliary Space : O(m)
This article is contributed Rachit Belwariar. If you like GeeksforGeeks and
would like to contribute, you can also write an article and mail your article to
[email protected]. See your article appearing on the GeeksforGeeks
main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more
information about the topic discussed above

You might also like