Table of Contents
Problem Statement
The problem “Number Of Longest Increasing Subsequence” states that you are given an array a[ ] of size n. Print the number of longest increasing subsequences in it.
Example
a[ ] = {1, 2, 5, 4, 7}
2
Explanation: The longest increasing subsequences can be seen in the above image.
Input : a[ ] = {1, 2, 3, 4, 5}
Output : 1 (1,2,3,4,5 is the longest sub-sequence here)
Algorithm for Number Of Longest Increasing Subsequence
- Initialize an array a[ ] of integer type of size n.
- Create a function to find number of the longest increasing sub-sequences which accept an array of integer type and it’s size as it’s parameters.
- Create two arrays of integer type len and cnt of size n and initialize every element of both the arrays as 1. Also, initialize an integer variable lis = 1.
- Traverse from 1 till n-1 using i and create an inner loop from 0 to i-1.
- Check if the element in array a[ ] at current index of outer loop is greater than the element in array a[ ] at the current index of the inner loop, check if the value + 1 in array len[ ] at current index of inner loop is greater than the element in array len[ ] at current index of outer loop, update the value in array len[ ] at current index of outer loop as the value + 1 in array len[ ] at current index of inner loop and the value in array cnt[ ] at current index of outer loop as the value in array cnt[ ] at current index of inner loop.
- Else if the value + 1 in array if len[ ] at current index of inner loop is equal to the element in array len[ ] at current index of outer loop, update the value in array cnt[ ] at current index of outer loop as the sum of the value in array cnt[ ] at current index of inner loop and the outer loop itself.
- Store the maximum of lis and len[i] in lis.
- Initialize a variable ans as 0.
- Traverse again from 0 to n-1 and check if len[i] is equal to lis add the value at the current index of cnt in ans.
- Return ans.
Code
C++ Program to find number of longest increasing subsequence
#include <bits/stdc++.h> using namespace std; class Longestsubseq{ public: int numOfIncSubseq(int a[], int n){ int len[n], cnt[n]; for(int i=0; i<n; i++){ len[i]=1; cnt[i]=1; } int lis = 1; for(int i=1; i<n; i++){ for(int j=0; j<i; j++){ if(a[i] > a[j]){ if(len[j]+1 > len[i]){ len[i] = len[j]+1; cnt[i] = cnt[j]; } else if(len[j]+1 == len[i]){ cnt[i] += cnt[j]; } } lis = max(lis, len[i]); } } int ans = 0; for(int i=0; i<n; i++){ if(len[i] == lis)ans += cnt[i]; } return ans; } }; int main(){ Longestsubseq ls; int a[] = {1,2,5,4,7}; int n = sizeof(a)/sizeof(a[0]); cout<<(ls.numOfIncSubseq(a, n)); return 0; }
2
Java Program to find number of longest increasing subsequence
import java.util.*; class Longestsubseq{ static int numOfIncSubseq(int[] a, int n){ int[] len = new int[n]; int[] cnt = new int[n]; for(int i=0; i<n; i++){ len[i]=1; cnt[i]=1; } int lis = 1; for(int i=1; i<n; i++){ for(int j=0; j<i; j++){ if(a[i] > a[j]){ if(len[j]+1 > len[i]){ len[i] = len[j]+1; cnt[i] = cnt[j]; } else if(len[j]+1 == len[i]){ cnt[i] += cnt[j]; } } lis = Math.max(lis, len[i]); } } int ans = 0; for(int i=0; i<n; i++){ if(len[i] == lis)ans += cnt[i]; } return ans; } public static void main (String[] args){ int[] a = {1,2,5,4,7}; int n = a.length; System.out.println(numOfIncSubseq(a, n)); } }
2
Complexity Analysis
Time Complexity
O(n*n) where n is the number of elements in the given array a[ ]. The time complexity is the same as what is required to find the longest increasing subsequence.
Space Complexity
O(n) because we used extra n space. We have used a len[] array which stores the longest increasing subsequence ending at ith element.