Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Interview Problems on DP
  • Practice DP
  • MCQs on DP
  • Tutorial on Dynamic Programming
  • Optimal Substructure
  • Overlapping Subproblem
  • Memoization
  • Tabulation
  • Tabulation vs Memoization
  • 0/1 Knapsack
  • Unbounded Knapsack
  • Subset Sum
  • LCS
  • LIS
  • Coin Change
  • Word Break
  • Egg Dropping Puzzle
  • Matrix Chain Multiplication
  • Palindrome Partitioning
  • DP on Arrays
  • DP with Bitmasking
  • Digit DP
  • DP on Trees
  • DP on Graph
Open In App
Next Article:
LCS (Longest Common Subsequence) of three strings
Next article icon

Longest Common Increasing Subsequence (LCS + LIS)

Last Updated : 05 Dec, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

Given two arrays, a[] and b[], find the length of the longest common increasing subsequence(LCIS). LCIS refers to a subsequence that is present in both arrays and strictly increases.
Prerequisites: LCS, LIS.

Examples:

Input: a[] = [3, 4, 9, 1], b[] = [5, 3, 8, 9, 10, 2, 1]
Output: 2
Explanation: The longest increasing subsequence that is common is {3, 9} and its length is 2.

Input: a[] = [1, 1, 4, 3], b[] = [1, 1, 3, 4]
Output: 2
Explanation: There are two common subsequences {1, 4} and {1, 3} both of length 2.

Table of Content

  • Using Recursion – O(2^(m+n)) Time and O(m+n) Space
  • Using Top-Down DP (Memoization) – O(m*n*m) Time and O(m*n*m) Space
  • Using Bottom-Up DP (Tabulation) – O(m*n) Time and O(n) Space

Using Recursion – O(2^(m+n)) Time and O(m+n) Space

We can identify a recursive pattern in this problem. There are three state variables: i index for array a[], j index for array b[] and prevIndex index of the previous element that we included from array a[].

We consider two cases for recursion:

  • If the element satisfies the following conditions, we include it in the subsequence and move on to the next element in both a[] and b[]
    1. prevIndex is equal to -1 or a[prevIndex] is greater than a[i].
    2. a[i] is equal to b[j].
  • We iterate to next element in either a or b.

Recurrence relation:

if (a[i] == b[j] and (prevIndex == -1 or a[i] < a[prevIndex]))

  • LCIS(i, j, prevIndex) = 1 + LCIS(i-1, j-1, i)

otherwise

  • LCIS(i, j, prevIndex) = max(LCIS(i-1, j, prevIndex), LCIS(i, j-1, prevIndex))​

Base Case: If either array is completely traversed i.e. if (i < 0 || j < 0) return 0

C++
// A C++ Program to find length of the Longest Common // Increasing Subsequence (LCIS)  #include <bits/stdc++.h> using namespace std;  // Recursive function to find the length of the //Longest Common Increasing Subsequence int findLCIS(int i, int j, int prevIndex,              vector<int> &a, vector<int> &b){        // Base case: If either array is completely     //traversed, return 0        if (i < 0 || j < 0)         return 0;      int include = 0;     int exclude = 0;      // If the current elements are equal and    	// maintain the increasing property     if (a[i] == b[j] && (prevIndex == -1 || a[i] < a[prevIndex])){                // Include the current element         include = 1 + findLCIS(i - 1, j - 1, i, a, b);      }      // Explore the subsequences by skipping     //an element in either of the arrays     exclude = max(findLCIS(i - 1, j, prevIndex, a, b),                         findLCIS(i, j - 1, prevIndex, a, b));      // Return the maximum of including or   	// excluding the current element     return max(include, exclude); }  int LCIS(vector<int> &a, vector<int> &b){     int m = a.size();     int n = b.size();     return findLCIS(m - 1, n - 1, -1, a, b); }  int main(){     vector<int> a = {3, 4, 9, 1};     vector<int> b = {5, 3, 8, 9, 10, 2, 1};      cout <<LCIS(a, b);     return (0); } 
Java
// A Java Program to find length of the Longest // Common Increasing Subsequence (LCIS) import java.io.*;  class GfG {      static int findLCIS(int i, int j, int prevIndex,                                 int[] a, int[] b){                // Base case: If either array is fully traversed         if (i < 0 || j < 0)             return 0;          int include = 0;         int exclude = 0;          // If current elements are equal and satisfy the         // increasing condition         if (a[i] == b[j]             && (prevIndex == -1 || a[i] < a[prevIndex])) {                      // Include the current element             include = 1 + findLCIS(                           i - 1, j - 1, i, a,                           b);          }          // Explore skipping an element from either array         exclude = Math.max(findLCIS(i - 1, j, prevIndex, a, b),                        findLCIS(i, j - 1, prevIndex, a, b));          // Return the maximum of including or excluding the         // current element         return Math.max(include, exclude);     }     static int LCIS(int[] a, int[] b){                return findLCIS(a.length - 1, b.length - 1, -1, a,                         b);     }      public static void main(String[] args){         int a[] = { 3, 4, 9, 1 };         int b[] = { 5, 3, 8, 9, 10, 2, 1 };          System.out.println(LCIS(a, b));     } } 
Python
# Python Program to find length of the  # Longest Common Increasing Subsequence (LCIS)  def findLCIS(i, j, prevIndex, a, b):            # Base case: If either array is fully traversed         if i < 0 or j < 0:             return 0                  include = 0         exclude = 0                  # If current elements are equal and         # satisfy the increasing condition         if a[i] == b[j] and (prevIndex == -1 or a[i] < a[prevIndex]):                         # Include the current element             include = 1 + findLCIS(i - 1, j - 1, i, a, b)                    # Explore skipping an element from either array         exclude = max(findLCIS(i - 1, j, prevIndex, a, b),                        findLCIS(i, j - 1, prevIndex, a, b))                  # Return the maximum of including or          #excluding the current element         return max(include, exclude)  def LCIS(a, b):                 # Start recursion from the last indices with no previous element         return findLCIS(len(a) - 1, len(b) - 1, -1, a, b)  if __name__ == "__main__":          a = [3, 4, 9, 1]     b = [5, 3, 8, 9, 10, 2, 1]      print(LCIS(a, b)) 
C#
// A C# Program to find length of the Longest // Common Increasing Subsequence (LCIS) using System;  class GfG {      // Recursive function to find the LCIS     static int FindLCIS(int i, int j, int prevIndex,                         int[] a, int[] b) {                // Base case: If either array is fully traversed         if (i < 0 || j < 0) {             return 0;         }          int include = 0;         int exclude = 0;          // If current elements are equal and satisfy the         // increasing condition         if (a[i] == b[j] && (prevIndex == -1 || a[i] < a[prevIndex])) {                       // Include the current element             include                 = 1                   + FindLCIS(i - 1, j - 1, i, a, b);         }          // Explore skipping an element from either array         exclude = Math.Max(             FindLCIS(i - 1, j, prevIndex, a, b),             FindLCIS(i, j - 1, prevIndex, a, b));          // Return the maximum of including or excluding the         // current element         return Math.Max(include, exclude);     }      static int LCIS(int[] a, int[] b) {                // Start recursion from the last indices with no         // previous element         return FindLCIS(a.Length - 1, b.Length - 1,                         -1, a, b);     }      static void Main() {                int[] a = { 3, 4, 9, 1 };         int[] b = { 5, 3, 8, 9, 10, 2, 1 };          Console.Write(LCIS(a, b));     } } 
JavaScript
// Javascript Program to find length of the Longest // Common Increasing Subsequence (LCIS)  function findLCIS(i, j, prevIndex, a, b){      // Base case: If either array is fully traversed     if (i < 0 || j < 0) {         return 0;     }      let include = 0;     let exclude = 0;      // If current elements are equal and satisfy the     // increasing condition     if (a[i] === b[j]         && (prevIndex === -1             || a[i] < a[prevIndex])) {          // Include the current element         include = 1 + findLCIS(i - 1, j - 1, i, a, b);     }      // Explore skipping an element from either array     exclude = Math.max(         findLCIS(i - 1, j, prevIndex, a, b),         findLCIS(i, j - 1, prevIndex, a, b));      // Return the maximum of including or excluding the     // current element     return Math.max(include, exclude); }  function LCIS(a, b){      // Start recursion from the last indices with no     // previous element     return findLCIS(a.length - 1, b.length - 1, -1,                     a, b); }  let a = [ 3, 4, 9, 1 ]; let b = [ 5, 3, 8, 9, 10, 2, 1 ];  console.log(LCIS(a, b)); 

Output
2

Using Top-Down DP (Memoization) – O(m*n*m) Time and O(m*n*m) Space

If we notice carefully, we can observe that the above recursive solution holds the following two properties of Dynamic Programming:

1. Optimal Substructure: Maximum subsequence length for a given i, j and prevIndex , i.e., LCIS(i, j, prevIndex), depends on the optimal solutions of the subproblems LCIS(i-1, j, prevIndex), LCIS(i, j-1, prevIndex) and LCIS(i-1, j-1, i). By choosing the maximum of these optimal substructures, we can efficiently calculate the maximum subsequence length.

2. Overlapping Subproblems: While applying a recursive approach in this problem, we notice that certain subproblems are computed multiple times.

  • There are three parameter that change in the recursive solution: i going from 0 to m-1, j going from 0 to n-1 and prevIndex going from 0 to m-1. So we create a 3D array of size m*n*m for memoization.
  • We initialize this array as -1 to indicate nothing is computed initially.
  • Now we modify our recursive solution to first check if the value is -1, then only make recursive calls. This way, we avoid re-computations of the same subproblems.
C++
// A C++ program to find length of the Longest Common // Increasing Subsequence (LCIS) using memoization  #include <bits/stdc++.h>  using namespace std;  // Recursive function with memoization to find LCIS int findLCIS(int i, int j, int prevIndex, vector<int> &a,              vector<int> &b, vector<vector<vector<int>>> &memo){      // Base case: If either array is fully traversed     if (i < 0 || j < 0)         return 0;      // If the result has already been computed, return it     if (memo[i][j][prevIndex + 1] != -1)         return memo[i][j][prevIndex + 1];      int include = 0;     int exclude = 0;      // If the current elements match and satisfy    	// the increasing condition     if (a[i] == b[j] &&          (prevIndex == -1 || a[i] < a[prevIndex])) {          // Include the current element         include = 1 + findLCIS(i - 1, j - 1, i, a, b, memo);     }      // Explore excluding the current element from either array     exclude =         max(findLCIS(i - 1, j, prevIndex, a, b, memo),              findLCIS(i, j - 1, prevIndex, a, b, memo));      // Store the result in the memo table and return it     memo[i][j][prevIndex + 1] = max(include, exclude);     return memo[i][j][prevIndex + 1]; }  // Function to initialize the memo table  // and start the recursion int LCIS(vector<int> &a, vector<int> &b) {     int m = a.size();     int n = b.size();      // Initialize the memoization table     // with -1 (indicating uncomputed states)     vector<vector<vector<int>>> memo(m,  	vector<vector<int>>(n, vector<int>(m + 1, -1)));      // Start recursion from the last indices   	// with no previous element     return findLCIS(m - 1, n - 1, -1, a, b, memo); }  int main() {      vector<int> a = { 3, 4, 9, 1 };     vector<int> b = { 5, 3, 8, 9, 10, 2, 1 };     cout << LCIS(a, b);     return 0; } 
Java
// A Java program to find length of the Longest Common // Increasing Subsequence (LCIS) using memoization  import java.io.*;  class GfG {        static int findLCIS(int i, int j, int prevIndex,                             int[] a, int[] b, int[][][] memo) {                   // Base case: If either array is fully traversed         if (i < 0 || j < 0)            return 0;          // If the result has already been computed, return it         if (memo[i][j][prevIndex + 1] != -1)            return memo[i][j][prevIndex + 1];          int include = 0;         int exclude = 0;          // If the current elements match and         // satisfy the increasing condition         if (a[i] == b[j] && (prevIndex == -1 || a[i] < a[prevIndex])) {                     // Include the current element             include = 1 + findLCIS(i - 1, j - 1, i, a, b, memo);          }          // Explore excluding the current element from either array         exclude = Math.max(findLCIS(i - 1, j, prevIndex, a, b, memo),                            findLCIS(i, j - 1, prevIndex, a, b, memo));          // Store the result in the memo table and return it         memo[i][j][prevIndex + 1] = Math.max(include, exclude);         return memo[i][j][prevIndex + 1];       }      // Function to initialize the memo table and start the recursion      static int LCIS(int[] a, int[] b) {         int m = a.length;         int n = b.length;                 // Initialize the memoization table with        // -1 (indicating uncomputed states)         int[][][] memo = new int[m][n][m + 1];         for (int[][] table : memo) {             for (int[] row : table) {                 java.util.Arrays.fill(row, -1);             }         }          // Start recursion from the last indices with no previous element         return findLCIS(m - 1, n - 1, -1, a, b, memo);     }        public static void main (String[] args) {                  int[] a = {3, 4, 9, 1 };         int[] b = {5, 3, 8, 9, 10, 2, 1};         System.out.println(LCIS(a, b));     } } 
Python
# A Python program to find length of the Longest Common # Increasing Subsequence (LCIS) using memoization def findLCIS(i, j, prev_index, a, b, memo):        # Base case: If either array is fully traversed     if i < 0 or j < 0:         return 0      # If the result has already been computed, return it     if memo[i][j][prev_index + 1] != -1:         return memo[i][j][prev_index + 1]      include = 0     exclude = 0      # If the current elements match and satisfy the increasing condition     if a[i] == b[j] and (prev_index == -1 or a[i] < a[prev_index]):                 # Include the current element         include = 1 + findLCIS(i - 1, j - 1, i, a, b, memo)       # Explore excluding the current element from either array     exclude = max(findLCIS(i - 1, j, prev_index, a, b, memo),                   findLCIS(i, j - 1, prev_index, a, b, memo))      # Store the result in the memo table and return it     memo[i][j][prev_index + 1] = max(include, exclude)     return memo[i][j][prev_index + 1]  def LCIS(a, b):     m = len(a)     n = len(b)          # Initialize the memoization table with -1     # (indicating uncomputed states)     memo = [[[ -1 for _ in range(m + 1)] for _ in range(n)] for _ in range(m)]      # Start recursion from the last indices with      # no previous element     return findLCIS(m - 1, n - 1, -1, a, b, memo)  a = [3, 4, 9, 1 ] b = [5, 3, 8, 9, 10, 2, 1] print(LCIS(a, b)) 
C#
// A C# program to find length of the Longest Common // Increasing Subsequence (LCIS) using memoization using System;  class GfG {        // Recursive function with memoization to find LCIS     static int FindLCIS(int i, int j, int prevIndex,                                 int[] a, int[] b,                                 int[, , ] memo){                // Base case: If either array is fully traversed         if (i < 0 || j < 0)             return 0;          // If the result has already been computed, return         // it         if (memo[i, j, prevIndex + 1] != -1)             return memo[i, j, prevIndex + 1];          int include = 0;         int exclude = 0;          // If the current elements match and satisfy the         // increasing condition         if (a[i] == b[j]             && (prevIndex == -1                 || a[i] < a[prevIndex])) {                      // Include the current element             include                 = 1                   + FindLCIS(                       i - 1, j - 1, i, a, b,                       memo);          }          // Explore excluding the current element from either         // array         exclude = Math.Max(             FindLCIS(i - 1, j, prevIndex, a, b, memo),             FindLCIS(i, j - 1, prevIndex, a, b,                      memo));          // Store the result in the memo table and return it         memo[i, j, prevIndex + 1]             = Math.Max(include, exclude);         return memo[i, j, prevIndex + 1];     }      // Function to initialize the memo table and start the     // recursion     static int LCIS(int[] a, int[] b){         int m = a.Length;         int n = b.Length;          // Initialize the memoization table with -1         // (indicating uncomputed states)         int[, , ] memo = new int[m, n, m + 1];         for (int i = 0; i < m; i++) {             for (int j = 0; j < n; j++) {                 for (int k = 0; k < m + 1; k++) {                     memo[i, j, k] = -1;                 }             }         }          // Start recursion from the last indices with no         // previous element         return FindLCIS(m - 1, n - 1, -1, a, b, memo);     }      static void Main(string[] args){         int[] a = {3, 4, 9, 1 };         int[] b = { 5, 3, 8, 9, 10, 2, 1 };         Console.WriteLine(LCIS(a, b));     } } 
JavaScript
// A Javascript program to find length of the Longest Common // Increasing Subsequence (LCIS) using memoization function findLCIS(i, j, prevIndex, a, b, memo) {      // Base case: If either array is fully traversed     if (i < 0 || j < 0)         return 0;      // If the result has already been computed, return it     if (memo[i][j][prevIndex + 1] !== -1)         return memo[i][j][prevIndex + 1];      let include = 0;     let exclude = 0;      // If the current elements match and satisfy the     // increasing condition     if (a[i] === b[j]         && (prevIndex === -1             || a[i] < a[prevIndex])) {                          // Include the current element         include = 1                   + findLCIS(                       i - 1, j - 1, i, a, b,                       memo);      }      // Explore excluding the current element from either     // array     exclude = Math.max(         findLCIS(i - 1, j, prevIndex, a, b, memo),         findLCIS(i, j - 1, prevIndex, a, b, memo));      // Store the result in the memo table and return it     memo[i][j][prevIndex + 1] = Math.max(include, exclude);     return memo[i][j][prevIndex + 1]; }  function LCIS(arr1, arr2) {     const m = a.length;     const n = b.length;          // Initialize the memoization table with -1 (indicating     // uncomputed states)     const memo = Array.from(         {length : m},         () => Array.from({length : n},                          () => Array(m + 1).fill(-1)));      // Start recursion from the last indices with no     // previous element     return findLCIS(m - 1, n - 1, -1, a, b, memo); }  const a = [ 3, 4, 9, 1 ]; const b = [ 5, 3, 8, 9, 10, 2, 1]; console.log(LCIS(a, b)); 

Output
2

Using Bottom-Up DP (Tabulation) – O(m*n) Time and O(n) Space

The idea is to iterate of every index j of b[] for every index i in a[]. We use a linear array dp of length n intialized with zero to keep track of the LCIS ending on jth index of b[]. We also use a variable currentLength to store the length of the LCIS for the current element of a[]. This variable helps to keep track of the LCIS ending at the previous index of a[] but not including the current element in a[].

  • If a[i] is equal to b[j], then found a potential element of the LCIS that ends at b[j]. At this point, we can update dp[j] to be the maximum of its current value and currentLength + 1. This is because currentLength keeps track of the longest LCIS that ends at a previous index in a[].
  • If a[i] > b[j], it means that b[j] can be part of an increasing subsequence that ends with a[i]. Hence, we need to update the currentLength to be the maximum value between currentLength and dp[j]. This ensures that currentLength holds the length of the longest subsequence ending at any previous element b[k] (where k < j).

After iterating through all elements of a[] and b[], the value of dp[] will hold the lengths of LCIS ending at each index of b[]. The maximum value in the dp[] array will be the length of the Longest Common Increasing Subsequence.

C++
// C++ Program to find length of the Longest Common // Increasing Subsequence (LCIS) using tabulation #include <bits/stdc++.h> using namespace std;  int LCIS(vector<int> &a, vector<int> &b) {     int m = a.size();     int n = b.size();      // Initialize a DP array to store lengths of LCIS    	// ending at each index of b     vector<int> dp(n, 0);      // Iterate through each element in a     for (int i = 0; i < m; i++) {                // Start from the end of b to avoid overwriting       	// dp[j] during iteration         int currentLength = 0;          // Iterate through each element in b to compare with a[i]         for (int j = 0; j < n; j++) {              // If a[i] == b[j], we may have found a            	// new LCIS ending at j in b             if (a[i] == b[j]) {                 dp[j] = max(dp[j], currentLength + 1);             }              // If a[i] > b[j], it means b[j] could            	// be part of an increasing subsequence             else if (a[i] > b[j]) {                  // Update currentLength with the               	// longest LCIS ending at b[j]                 currentLength = max(currentLength, dp[j]);             }         }     }      // The maximum value in dp[] is the length of    	// the longest common increasing subsequence     return *max_element(dp.begin(), dp.end()); }  int main() {     vector<int> a = {3, 4, 9, 1 };     vector<int> b = {5, 3, 8, 9, 10, 2, 1};     cout << LCIS(a, b);     return 0; } 
Java
// Java Program to find length of the Longest Common // Increasing Subsequence (LCIS) using tabulation import java.util.*;  class GfG {           static int LCIS(int[] a, int[] b) {         int m = a.length;         int n = b.length;          // Initialize a linear DP array to store         // lengths of LCIS ending at each index of arr2         int[] dp = new int[n];          // Iterate through each element in arr1         for (int i = 0; i < m; i++) {              // Start from the end of arr2 to avoid             // overwriting dp[j] during iteration             int currentLength = 0;              // Iterate through each element in arr2             // to compare with arr1[i]             for (int j = 0; j < n; j++) {                  // If arr1[i] == arr2[j], we may have found                  // a new LCIS ending at j in arr2                 if (a[i] == b[j]) {                     dp[j] = Math.max(dp[j], currentLength + 1);                 }                  // If arr1[i] > arr2[j], it means arr2[j] could                  // be part of an increasing subsequence                 else if (a[i] > b[j]) {                      // Update currentLength with the longest                     // LCIS ending at arr2[j]                     currentLength = Math.max(currentLength, dp[j]);                 }             }         }          // The maximum value in dp[] is the length of the         // longest common increasing subsequence         int result = 0;         for (int i = 0; i < n; i++) {             result = Math.max(result, dp[i]);         }          return result;     }      public static void main(String[] args) {         int[] a = {3, 4, 9, 1 };         int[] b = {5, 3, 8, 9, 10, 2, 1};         System.out.println(LCIS(a, b));     } } 
Python
# Java Program to find length of the Longest Common # Increasing Subsequence (LCIS) using tabulation def LCIS(a, b):     m = len(a)     n = len(b)      # Initialize a DP array to store lengths      # of LCIS ending at each index of b     dp = [0] * n      # Iterate through each element in a     for i in range(m):         currentLength = 0          # Iterate through each element in b         for j in range(n):                        # If a[i] == b[j], we may have found a             # new LCIS ending at j in b             if a[i] == b[j]:                 dp[j] = max(dp[j], currentLength + 1)                              # If a[i] > b[j], it means b[j] could be             # part of an increasing subsequence             elif a[i] > b[j]:                 currentLength = max(currentLength, dp[j])      # The maximum value in dp[] is the length of the     # longest common increasing subsequence     return max(dp)   a = [3, 4, 9, 1 ] b = [5, 3, 8, 9, 10, 2, 1] print(LCIS(a, b))  
C#
// C# Program to find length of the Longest Common // Increasing Subsequence (LCIS) using tabulation using System;  class GfG {     static int LCIS(int[] a, int[] b) {         int m = a.Length;         int n = b.Length;          // Initialize a DP array to store lengths       	// of LCIS ending at each index of b         int[] dp = new int[n];          // Iterate through each element in a         for (int i = 0; i < m; i++) {             int currentLength = 0;              // Iterate through each element in b             for (int j = 0; j < n; j++) {                                // If a[i] == b[j], we may have found               	// a new LCIS ending at j in b                 if (a[i] == b[j]) {                     dp[j] = Math.Max(dp[j], currentLength + 1);                 }                                // If a[i] > b[j], it means b[j] could be               	// part of an increasing subsequence                 else if (a[i] > b[j]) {                     currentLength = Math.Max(currentLength, dp[j]);                 }             }         }          // The maximum value in dp[] is the length of the       	// longest common increasing subsequence         int result = 0;         foreach (int value in dp) {             result = Math.Max(result, value);         }          return result;     }      static void Main() {         int[] a = { 3, 4, 9, 1 };         int[] b = {5, 3, 8, 9, 10, 2, 1 };         Console.WriteLine(LCIS(a, b));     } } 
JavaScript
// Javascript Program to find length of the Longest // Common Increasing Subsequence (LCIS) using tabulation function LCIS(a, b) {     const m = a.length;     const n = b.length;      // Initialize a DP array to store lengths of LCIS ending     // at each index of b     let dp = new Array(n).fill(0);      // Iterate through each element in a     for (let i = 0; i < m; i++) {         let currentLength = 0;          // Iterate through each element in b         for (let j = 0; j < n; j++) {                      // If a[i] == b[j], we may have found a new LCIS             // ending at j in b             if (a[i] === b[j]) {                 dp[j] = Math.max(dp[j], currentLength + 1);             }                          // If a[i] > b[j], it means b[j] could be part             // of an increasing subsequence             else if (a[i] > b[j]) {                 currentLength                     = Math.max(currentLength, dp[j]);             }         }     }      // The maximum value in dp[] is the length of the     // longest common increasing subsequence     return Math.max(...dp); }  const a = [ 3, 4, 9, 1  ]; const b = [ 5, 3, 8, 9, 10, 2, 1 ]; console.log(LCIS(a, b)); 

Output
2


Next Article
LCS (Longest Common Subsequence) of three strings
author
kartik
Improve
Article Tags :
  • Arrays
  • DSA
  • Dynamic Programming
  • LCS
  • LIS
  • subsequence
Practice Tags :
  • Arrays
  • Dynamic Programming
  • LCS

Similar Reads

  • Longest Common Subsequence (LCS)
    Given two strings, s1 and s2, the task is to find the length of the Longest Common Subsequence. If there is no common subsequence, return 0. A subsequence is a string generated from the original string by deleting 0 or more characters, without changing the relative order of the remaining characters.
    15+ min read
  • Printing Longest Common Subsequence
    Given two sequences, print the longest subsequence present in both of them. Examples: LCS for input Sequences “ABCDGH” and “AEDFHR” is “ADH” of length 3. LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4.We have discussed Longest Common Subsequence (LCS) problem in a previous post
    15+ min read
  • Longest Common Subsequence | DP using Memoization
    Given two strings s1 and s2, the task is to find the length of the longest common subsequence present in both of them. Examples: Input: s1 = “ABCDGH”, s2 = “AEDFHR” Output: 3 LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4. Input: s1 = “striver”, s2 = “raj” Output: 1 The naive s
    13 min read
  • Longest Common Increasing Subsequence (LCS + LIS)
    Given two arrays, a[] and b[], find the length of the longest common increasing subsequence(LCIS). LCIS refers to a subsequence that is present in both arrays and strictly increases.Prerequisites: LCS, LIS. Examples: Input: a[] = [3, 4, 9, 1], b[] = [5, 3, 8, 9, 10, 2, 1]Output: 2Explanation: The lo
    15+ min read
  • LCS (Longest Common Subsequence) of three strings
    Given 3 strings say s1, s2 and s3. The task is to find the longest common sub-sequence in all three given sequences. Examples: Input: s1 = "geeks" , s2 = "geeksfor", s3 = "geeksforgeeks"Output : 5Explanation: Longest common subsequence is "geeks" i.e., length = 5Input: s1= "abcd1e2" , s2= "bc12ea" ,
    15+ min read
  • C++ Program for Longest Common Subsequence
    LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So
    3 min read
  • Java Program for Longest Common Subsequence
    LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So
    4 min read
  • Python Program for Longest Common Subsequence
    LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So
    3 min read
  • Problems on LCS

    • Edit distance and LCS (Longest Common Subsequence)
      In standard Edit Distance where we are allowed 3 operations, insert, delete, and replace. Consider a variation of edit distance where we are allowed only two operations insert and delete, find edit distance in this variation. Examples: Input : str1 = "cat", st2 = "cut"Output : 2We are allowed to ins
      6 min read

    • Length of longest common subsequence containing vowels
      Given two strings X and Y of length m and n respectively. The problem is to find the length of the longest common subsequence of strings X and Y which contains all vowel characters. Examples: Input : X = "aieef" Y = "klaief"Output : aieInput : X = "geeksforgeeks" Y = "feroeeks"Output : eoeeSource:Pa
      14 min read

    • Longest Common Subsequence (LCS) by repeatedly swapping characters of a string with characters of another string
      Given two strings A and B of lengths N and M respectively, the task is to find the length of the longest common subsequence that can be two strings if any character from string A can be swapped with any other character from B any number of times. Examples: Input: A = "abdeff", B = "abbet"Output: 4Ex
      7 min read

    • Longest Common Subsequence with at most k changes allowed
      Given two sequence P and Q of numbers. The task is to find Longest Common Subsequence of two sequences if we are allowed to change at most k element in first sequence to any value. Examples: Input : P = { 8, 3 } Q = { 1, 3 } K = 1 Output : 2 If we change first element of first sequence from 8 to 1,
      8 min read

    • Minimum cost to make Longest Common Subsequence of length k
      Given two string X, Y and an integer k. Now the task is to convert string X with the minimum cost such that the Longest Common Subsequence of X and Y after conversion is of length k. The cost of conversion is calculated as XOR of old character value and new character value. The character value of 'a
      14 min read

    • Longest Common Substring
      Given two strings 's1' and 's2', find the length of the longest common substring. Example: Input: s1 = "GeeksforGeeks", s2 = "GeeksQuiz" Output : 5 Explanation:The longest common substring is "Geeks" and is of length 5. Input: s1 = "abcdxyz", s2 = "xyzabcd" Output : 4Explanation:The longest common s
      15+ min read

    • Longest Common Subsequence of two arrays out of which one array consists of distinct elements only
      Given two arrays firstArr[], consisting of distinct elements only, and secondArr[], the task is to find the length of LCS between these 2 arrays. Examples: Input: firstArr[] = {3, 5, 1, 8}, secondArr[] = {3, 3, 5, 3, 8}Output: 3.Explanation: LCS between these two arrays is {3, 5, 8}. Input : firstAr
      7 min read

    • Longest Repeating Subsequence
      Given a string s, the task is to find the length of the longest repeating subsequence, such that the two subsequences don't have the same string character at the same position, i.e. any ith character in the two subsequences shouldn't have the same index in the original string. Examples: Input: s= "a
      15+ min read

    • Longest Common Anagram Subsequence
      Given two strings str1 and str2 of length n1 and n2 respectively. The problem is to find the length of the longest subsequence which is present in both the strings in the form of anagrams. Note: The strings contain only lowercase letters. Examples: Input : str1 = "abdacp", str2 = "ckamb" Output : 3
      7 min read

    • Length of Longest Common Subsequence with given sum K
      Given two arrays a[] and b[] and an integer K, the task is to find the length of the longest common subsequence such that sum of elements is equal to K. Examples: Input: a[] = { 9, 11, 2, 1, 6, 2, 7}, b[] = {1, 2, 6, 9, 2, 3, 11, 7}, K = 18Output: 3Explanation: Subsequence { 11, 7 } and { 9, 2, 7 }
      15+ min read

    • Longest Common Subsequence with no repeating character
      Given two strings s1 and s2, the task is to find the length of the longest common subsequence with no repeating character. Examples: Input: s1= "aabbcc", s2= "aabc"Output: 3Explanation: "aabc" is longest common subsequence but it has two repeating character 'a'.So the required longest common subsequ
      10 min read

    • Find the Longest Common Subsequence (LCS) in given K permutations
      Given K permutations of numbers from 1 to N in a 2D array arr[][]. The task is to find the longest common subsequence of these K permutations. Examples: Input: N = 4, K = 3arr[][] = {{1, 4, 2, 3}, {4, 1, 2, 3}, {1, 2, 4, 3}}Output: 3Explanation: Longest common subsequence is {1, 2, 3} which has leng
      10 min read

    • Find length of longest subsequence of one string which is substring of another string
      Given two strings X and Y. The task is to find the length of the longest subsequence of string X which is a substring in sequence Y. Examples: Input : X = "ABCD", Y = "BACDBDCD"Output : 3Explanation: "ACD" is longest subsequence of X which is substring of Y. Input : X = "A", Y = "A"Output : 1 Perqui
      15+ min read

    • Length of longest common prime subsequence from two given arrays
      Given two arrays arr1[] and arr2[] of length N and M respectively, the task is to find the length of the longest common prime subsequence that can be obtained from the two given arrays. Examples: Input: arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, arr2[] = {2, 5, 6, 3, 7, 9, 8} Output: 4 Explanation: The l
      11 min read

    • A Space Optimized Solution of LCS
      Given two strings, s1 and s2, the task is to find the length of the Longest Common Subsequence. If there is no common subsequence, return 0. Examples: Input: s1 = “ABCDGH”, s2 = “AEDFHR”Output: 3Explanation: The longest subsequence present in both strings is "ADH". Input: s1 = “AGGTAB”, s2 = “GXTXAY
      13 min read

    • Longest common subarray in the given two arrays
      Given two arrays A[] and B[] of N and M integers respectively, the task is to find the maximum length of an equal subarray or the longest common subarray between the two given array. Examples: Input: A[] = {1, 2, 8, 2, 1}, B[] = {8, 2, 1, 4, 7} Output: 3 Explanation: The subarray that is common to b
      15+ min read

    • Number of ways to insert a character to increase the LCS by one
      Given two strings A and B. The task is to count the number of ways to insert a character in string A to increase the length of the Longest Common Subsequence between string A and string B by 1. Examples: Input : A = "aa", B = "baaa" Output : 4 The longest common subsequence shared by string A and st
      11 min read

    • Longest common subsequence with permutations allowed
      Given two strings in lowercase, find the longest string whose permutations are subsequences of given two strings. The output longest string must be sorted. Examples: Input : str1 = "pink", str2 = "kite" Output : "ik" The string "ik" is the longest sorted string whose one permutation "ik" is subseque
      7 min read

    • Longest subsequence such that adjacent elements have at least one common digit
      Given an array arr[], the task is to find the length of the longest sub-sequence such that adjacent elements of the subsequence have at least one digit in common. Examples: Input: arr[] = [1, 12, 44, 29, 33, 96, 89] Output: 5 Explanation: The longest sub-sequence is [1 12 29 96 89] Input: arr[] = [1
      15+ min read

    • Longest subsequence with different adjacent characters
      Given string str. The task is to find the longest subsequence of str such that all the characters adjacent to each other in the subsequence are different. Examples:   Input: str = "ababa" Output: 5 Explanation: "ababa" is the subsequence satisfying the condition Input: str = "xxxxy" Output: 2 Explan
      11 min read

    • Longest subsequence such that difference between adjacents is one
      Given an array arr[] of size n, the task is to find the longest subsequence such that the absolute difference between adjacent elements is 1. Examples: Input: arr[] = [10, 9, 4, 5, 4, 8, 6]Output: 3Explanation: The three possible subsequences of length 3 are [10, 9, 8], [4, 5, 4], and [4, 5, 6], whe
      15+ min read

    • Longest Uncommon Subsequence
      Given two strings, find the length of longest uncommon subsequence of the two strings. The longest uncommon subsequence is defined as the longest subsequence of one of these strings which is not a subsequence of other strings. Examples: Input : "abcd", "abc"Output : 4The longest subsequence is 4 bec
      12 min read

    • LCS formed by consecutive segments of at least length K
      Given two strings s1, s2 and K, find the length of the longest subsequence formed by consecutive segments of at least length K. Examples: Input : s1 = aggayxysdfa s2 = aggajxaaasdfa k = 4 Output : 8 Explanation: aggasdfa is the longest subsequence that can be formed by taking consecutive segments, m
      9 min read

    • Longest Increasing Subsequence using Longest Common Subsequence Algorithm
      Given an array arr[] of N integers, the task is to find and print the Longest Increasing Subsequence.Examples: Input: arr[] = {12, 34, 1, 5, 40, 80} Output: 4 {12, 34, 40, 80} and {1, 5, 40, 80} are the longest increasing subsequences.Input: arr[] = {10, 22, 9, 33, 21, 50, 41, 60, 80} Output: 6 Prer
      12 min read

geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences