# Print All Longest Increasing Subsequences | Solution

## Print All Longest Increasing Subsequences | Solution

`1. You are given a number N representing number of elements.2. You are given N space separated numbers (ELE : elements).3. Your task is to find & print      3.1) Length of "Longest Increasing Subsequence"(LIS).    3.2) All "Longest Increasing Subsequence(s)"(LIS).NOTE: Checkout sample question/solution video inorder to have more insight.`
Input Format
`A number N (representing "NUMBER OF ELEMENTS").ELE1 ,ELE2 ,ELE3 ,ELE4 .... ELEn (N space separated numbers represnting numbers).`
Output Format
`1) A number representing Length of "Longest Increasing Subsequence"(LIS).2) Strings representing "Longest Increasing Subsequence(s)"(LIS).`
`Constraints1 <= N <= 1001 <= ELE <= 1000Sample Input1010 22 9 33 21 50 41 60 80 1Sample Output610 -> 22 -> 33 -> 41 -> 60 -> 8010 -> 22 -> 33 -> 50 -> 60 -> 80#include <bits/stdc++.h>using namespace std;#define int            long long int#define F              first#define S              second#define pb             push_back#define si             set <int>#define vi             vector <int>#define pii            pair <int, int>#define vpi            vector <pii>#define vpp            vector <pair<int, pii>>#define mii            map <int, int>#define mpi            map <pii, int>#define spi            set <pii>#define endl           "\n"#define sz(x)          ((int) x.size())#define all(p)         p.begin(), p.end()#define double         long double#define que_max        priority_queue <int>#define que_min        priority_queue <int, vi, greater<int>>#define bug(...)       __f (#__VA_ARGS__, __VA_ARGS__)#define print(a)       for(auto x : a) cout << x << " "; cout << endl#define print1(a)      for(auto x : a) cout << x.F << " " << x.S << endl#define print2(a,x,y)  for(int i = x; i < y; i++) cout<< a[i]<< " "; cout << endlinline int power(int a, int b){  int x = 1;  while (b)  {    if (b & 1) x *= a;    a *= a;    b >>= 1;  }  return x;}template <typename Arg1>void __f (const char* name, Arg1&& arg1) { cout << name << " : " << arg1 << endl; }template <typename Arg1, typename... Args>void __f (const char* names, Arg1&& arg1, Args&&... args){  const char* comma = strchr (names + 1, ',');  cout.write (names, comma - names) << " : " << arg1 << " | "; __f (comma + 1, args...);}const int N = 200005;struct Node{  int idx,val,len;  string psf;  Node(int idx,int val,int len,string s){    this->idx=idx;    this->val=val;    this->len=len;    psf=s;  }};void solve() {int n;cin>>n;vi v(n);for (int i = 0; i < n; i++){  cin>>v[i];}vi dp(n,0);int lis=0,idx=-1;for(int i=0; i<n; i++){  int maxx=0;  for(int j=0; j<i; j++){    if(v[j]<=v[i]){      maxx=max(maxx,dp[j]);    }  }  if(lis<1+maxx){idx=i;};  lis=max(1+maxx,lis);  dp[i]=max(dp[i],1+maxx);}cout<<lis<<endl;queue<Node>q;for (int i = 0; i < n; i++){  if(dp[i]==lis){    q.push(Node(i,v[i],lis,to_string(v[i])));  }}while(!q.empty()){  Node f=q.front();  q.pop();  if(f.len==1)cout<<f.psf<<endl;  for(int i=f.idx-1; i>=0; i--){    if(dp[i]==f.len-1 && v[i]<=f.val){      q.push(Node(i,v[i],f.len-1,to_string(v[i])+" -> "+f.psf));    }  }}}int32_t main(){  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);  clock_t z = clock();  int t = 1;  // cin >> t;  while (t--) solve();  return 0;}`