C++ Program for Longest Increasing Subsequence
Last Updated :
04 Apr, 2023
The Longest Increasing Subsequence (LIS) problem is to find the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order. For example, the length of LIS for {10, 22, 9, 33, 21, 50, 41, 60, 80} is 6 and LIS is {10, 22, 33, 50, 60, 80}.

Examples:
Input : arr[] = {3, 10, 2, 1, 20}
Output : Length of LIS = 3
The longest increasing subsequence is 3, 10, 20
Input : arr[] = {3, 2}
Output : Length of LIS = 1
The longest increasing subsequences are {3} and {2}
Input : arr[] = {50, 3, 10, 7, 40, 80}
Output : Length of LIS = 4
The longest increasing subsequence is {3, 7, 40, 80}
Overlapping Subproblems:
Considering the above implementation, the following is a recursion tree for an array of size 4. lis(n) gives us the length of LIS for arr[].
lis(4)
/ |
lis(3) lis(2) lis(1)
/ /
lis(2) lis(1) lis(1)
/
lis(1)
We can see that there are many subproblems that are solved again and again. So this problem has Overlapping Substructure property and recomputation of same subproblems can be avoided by either using Memoization or Tabulation. Following is a tabulated implementation for the LIS problem.
C++
/* Dynamic Programming C/C++ implementation of LIS problem */
#include <iostream>
using namespace std;
/* lis() returns the length of the longest increasing
subsequence in arr[] of size n */
int lis(int arr[], int n)
{
int *lis, i, j, max = 0;
lis = (int*)malloc(sizeof(int) * n);
/* Initialize LIS values for all indexes */
for (i = 0; i < n; i++)
lis[i] = 1;
/* Compute optimized LIS values in bottom up manner */
for (i = 1; i < n; i++)
for (j = 0; j < i; j++)
if (arr[i] > arr[j] && lis[i] < lis[j] + 1)
lis[i] = lis[j] + 1;
/* Pick maximum of all LIS values */
for (i = 0; i < n; i++)
if (max < lis[i])
max = lis[i];
/* Free memory to avoid memory leak */
free(lis);
return max;
}
/* Driver program to test above function */
int main()
{
int arr[] = { 10, 22, 9, 33, 21, 50, 41, 60 };
int n = sizeof(arr) / sizeof(arr[0]);
cout <<"Length of lis is "<< lis(arr, n);
return 0;
}
// this code is contributed by shivanisinghss2110
C
/* Dynamic Programming C/C++ implementation of LIS problem */
#include <stdio.h>
#include <stdlib.h>
/* lis() returns the length of the longest increasing
subsequence in arr[] of size n */
int lis(int arr[], int n)
{
int *lis, i, j, max = 0;
lis = (int*)malloc(sizeof(int) * n);
/* Initialize LIS values for all indexes */
for (i = 0; i < n; i++)
lis[i] = 1;
/* Compute optimized LIS values in bottom up manner */
for (i = 1; i < n; i++)
for (j = 0; j < i; j++)
if (arr[i] > arr[j] && lis[i] < lis[j] + 1)
lis[i] = lis[j] + 1;
/* Pick maximum of all LIS values */
for (i = 0; i < n; i++)
if (max < lis[i])
max = lis[i];
/* Free memory to avoid memory leak */
free(lis);
return max;
}
/* Driver program to test above function */
int main()
{
int arr[] = { 10, 22, 9, 33, 21, 50, 41, 60 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("Length of lis is %d\n", lis(arr, n));
return 0;
}
Java
/* Dynamic Programming Java implementation
of LIS problem */
import java.util.*;
class GFG
{
/*
* lis() returns the length of the longest
* increasing subsequence in arr[] of size n
*/
static int lis(int[] arr, int n)
{
int max = 0;
int[] lst = new int[n];
// initialize LIS values for all indexes
Arrays.fill(lst, 1);
/* Compute optimized LIS values
in bottom up manner */
for (int i = 1; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (arr[i] > arr[j] &&
lst[i] < lst[j] + 1)
lst[i] = lst[j] + 1;
}
}
/* Pick maximum of all LIS values */
for (int i = 0; i < n; i++)
if (max < lst[i])
max = lst[i];
return max;
}
// Driver Code
public static void main(String[] args)
{
int[] arr = { 10, 22, 9, 33, 21, 50, 41, 60 };
int n = arr.length;
System.out.println("Length of lis is " +
lis(arr, n));
}
}
// This code is contributed by
// sanjeev2552
Python3
# Dynamic Programming python3
# implementation of LIS problem
# lis() returns the length of the
# longest increasing subsequence
# in arr[] of size n
def lis(arr, n):
i, j, maxm = 0, 0, 0
# initialize LIS values for all indexes
lst = [1 for s in range(n)]
for i in range(1, n):
for j in range(0, i):
if (arr[i] > arr[j] and
lst[i] < lst[j] + 1):
lst[i] = lst[j] + 1
# Pick maximum of all LIS values
for i in range(0, n):
if maxm < lst[i]:
maxm = lst[i]
return maxm
# Driver Code
arr = [10, 22, 9, 33, 21, 50, 41, 60]
n = len(arr)
print("Length of lst is", lis(arr, n))
# This code is contributed
# by Mohit kumar 29
C#
/* Dynamic Programming C# implementation
of LIS problem */
using System;
public class GFG
{
/*
* lis() returns the length of the longest
* increasing subsequence in arr[] of size n
*/
static int lis(int[] arr, int n)
{
int max = 0;
int[] lst = new int[n];
// initialize LIS values for all indexes
Array.Fill(lst, 1);
/* Compute optimized LIS values
in bottom up manner */
for (int i = 1; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (arr[i] > arr[j] && lst[i] < lst[j] + 1)
{
lst[i] = lst[j] + 1;
}
}
}
/* Pick maximum of all LIS values */
for (int i = 0; i < n; i++)
if (max < lst[i])
max = lst[i];
return max;
}
// Driver code
static public void Main ()
{
int[] arr = { 10, 22, 9, 33, 21, 50, 41, 60 };
int n = arr.Length;
Console.WriteLine("Length of lis is " + lis(arr, n));
}
}
// This code is contributed by avanitrachhadiya2155
JavaScript
<script>
/* Dynamic Programming Javascript implementation
of LIS problem */
/*
* lis() returns the length of the longest
* increasing subsequence in arr[] of size n
*/
function lis(arr,n)
{
let max = 0;
let lst = new Array(n);
// initialize LIS values for all indexes
for(let i=0;i<lst.length;i++)
{
lst[i]=1;
}
/* Compute optimized LIS values
in bottom up manner */
for (let i = 1; i < n; i++)
{
for (let j = 0; j < i; j++)
{
if (arr[i] > arr[j] &&
lst[i] < lst[j] + 1)
lst[i] = lst[j] + 1;
}
}
/* Pick maximum of all LIS values */
for (let i = 0; i < n; i++)
if (max < lst[i])
max = lst[i];
return max;
}
// Driver Code
let arr=[10, 22, 9, 33, 21, 50, 41, 60 ];
let n = arr.length;
document.write("Length of lis is " +
lis(arr, n));
// This code is contributed by patel2127
</script>
Output: Length of lis is 5
Complexity Analysis:
Time Complexity: O(n2). As nested loop is used.
Auxiliary Space: O(n).
Please refer complete article on Dynamic Programming | Set 3 (Longest Increasing Subsequence) for more details!
Method 2 : Lower Bound based approach
Algorithm :
1. Iterate the array.
2. Declare a new array ans to add the newly constructed increasing subsequence.
2. For every index, if lower_bound is points to the ending of the array ans, push it into a vector ans.
3. Return the ans array size.
C++
#include <bits/stdc++.h>
using namespace std;
int longest_increasing_subsequence(vector<int>& arr)
{
vector<int> ans;
int n = arr.size();
for (int i = 0; i < n; i++) {
auto it
= lower_bound(ans.begin(), ans.end(), arr[i]);
if (it == ans.end()) {
ans.push_back(arr[i]);
}
else {
*it = arr[i];
}
}
return ans.size();
}
int main()
{
vector<int> a = { 10, 22, 9, 33, 21, 50, 41, 60 };
int ans = longest_increasing_subsequence(a);
cout << ans;
return 0;
}
Java
// Java code for above approach
import java.util.*;
public class Main {
public static int longestIncreasingSubsequence(List<Integer> arr) {
List<Integer> ans = new ArrayList<>();
int n = arr.size();
for (int i = 0; i < n; i++) {
int it = arr.get(i);
int idx = Collections.binarySearch(ans, it);
if (idx < 0) {
idx = -(idx + 1);
if (idx == ans.size()) {
ans.add(it);
} else {
ans.set(idx, it);
}
}
}
return ans.size();
}
public static void main(String[] args) {
List<Integer> a = Arrays.asList(10, 22, 9, 33, 21, 50, 41, 60);
int ans = longestIncreasingSubsequence(a);
System.out.println(ans);
}
}
// This code is contributed by Aman Kumar.
C#
using System;
using System.Collections.Generic;
public class Program {
public static int
LongestIncreasingSubsequence(List<int> arr)
{
List<int> ans = new List<int>();
List<int> prevIdx = new List<int>();
int n = arr.Count;
for (int i = 0; i < n; i++) {
var it = ans.BinarySearch(arr[i]);
if (it < 0) {
it = ~it;
if (it == ans.Count) {
ans.Add(arr[i]);
prevIdx.Add(ans.Count - 2);
}
else {
ans[it] = arr[i];
prevIdx.Add(it == 0 ? -1
: prevIdx[it - 1]);
}
}
else {
prevIdx.Add(it == 0 ? -1 : prevIdx[it - 1]);
}
}
int len = ans.Count;
List<int> subseq = new List<int>();
int idx = len - 1;
while (idx >= 0) {
subseq.Add(ans[idx]);
idx = prevIdx[idx];
}
subseq.Reverse();
return len;
}
public static void Main()
{
List<int> a = new List<int>{ 10, 22, 9, 33,
21, 50, 41, 60 };
int ans = LongestIncreasingSubsequence(a);
Console.WriteLine(ans);
}
}
// This code is contributed by user_dtewbxkn77n
Time Complexity: O(nlogn) , n = size of array.
Space Complexity: O(n)
Similar Reads
C/C++ Program for Longest Increasing Subsequence
Given an array arr[] of size N, the task is to find the length of the Longest Increasing Subsequence (LIS) i.e., the longest possible subsequence in which the elements of the subsequence are sorted in increasing order. Examples: Input: arr[] = {3, 10, 2, 1, 20}Output: 3Explanation: The longest incre
8 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
C++ Program for Longest subsequence of a number having same left and right rotation
Given a numeric string S, the task is to find the maximum length of a subsequence having its left rotation equal to its right rotation. Examples: Input: S = "100210601" Output: 4 Explanation: The subsequence "0000" satisfies the necessary condition. The subsequence "1010" generates the string "0101"
4 min read
Find the longest subsequence of an array having LCM at most K
Given an array arr[] of N elements and a positive integer K. The task is to find the longest sub-sequence in the array having LCM (Least Common Multiple) at most K. Print the LCM and the length of the sub-sequence, following the indexes (starting from 0) of the elements of the obtained sub-sequence.
10 min read
C++ Program for Size of The Subarray With Maximum Sum
An array is given, find length of the subarray having maximum sum. Examples : Input : a[] = {1, -2, 1, 1, -2, 1} Output : Length of the subarray is 2 Explanation: Subarray with consecutive elements and maximum sum will be {1, 1}. So length is 2 Input : ar[] = { -2, -3, 4, -1, -2, 1, 5, -3 } Output :
4 min read
C++ Program for Shortest Un-ordered Subarray
An array is given of n length, and problem is that we have to find the length of shortest unordered {neither increasing nor decreasing} sub array in given array.Examples: Input : n = 5 7 9 10 8 11 Output : 3 Explanation : 9 10 8 unordered sub array. Input : n = 5 1 2 3 4 5 Output : 0 Explanation : A
2 min read
C++ Program To Find Length Of The Longest Substring Without Repeating Characters
Given a string str, find the length of the longest substring without repeating characters. For âABDEFGABEFâ, the longest substring are âBDEFGAâ and "DEFGAB", with length 6.For âBBBBâ the longest substring is âBâ, with length 1.For "GEEKSFORGEEKS", there are two longest substrings shown in the below
6 min read
Maximum contiguous decreasing sequence obtained by removing any one element
Given an array arr[] of N integers. The task is to find the length of the contiguous strictly decreasing sequence that can be derived after removing at most one element from the array arr[]. Examples Input: arr[] = {8, 7, 3, 5, 2, 9} Output: 4 Explanation: If we remove 3, The maximum length of decre
10 min read
Longest subsequence possible that starts and ends with 1 and filled with 0 in the middle
Given a binary string s, the task is to find the length of the longest subsequence that can be divided into three substrings such that the first and third substrings are either empty or filled with 1 and the substring at the middle is either empty or filled with 0. Examples: Input: s = "1001" Output
7 min read
C++ Program For Finding The Length Of Longest Palindrome List In A Linked List Using O(1) Extra Space
Given a linked list, find the length of the longest palindrome list that exists in that linked list. Examples: Input : List = 2->3->7->3->2->12->24 Output : 5 The longest palindrome list is 2->3->7->3->2 Input : List = 12->4->4->3->14 Output : 2 The longest
3 min read