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).
Constraints
1 <= N <= 100
1 <= ELE <= 1000
Sample Input
10
10 22 9 33 21 50 41 60 80 1
Sample Output
6
10 -> 22 -> 33 -> 41 -> 60 -> 80
10 -> 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 << endl

inline 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;
}


Post a Comment

0 Comments