Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int notVisited = -1;
- vector<int> dp, nxtIndx;
- int f(int indx, vector<int> &v)
- {
- if(dp[indx] != notVisited) return dp[indx];
- int ans = 0, subans;
- for(int i = indx + 1; i < v.size(); i++) {
- if(v[i] > v[indx]) {
- subans = f(i, v);
- if(subans > ans) {
- ans = subans;
- nxtIndx[indx] = i;
- }
- ans = max(ans, f(i, v));
- }
- }
- dp[indx] = 1 + ans;
- return dp[indx];
- }
- vector<int> genLis(vector<int> v)
- {
- dp.assign(v.size()+1, notVisited);
- nxtIndx.assign(v.size()+1, notVisited);
- int ans = 0, subans, si = -1;
- for(int i = 0; i < v.size(); i++) {
- subans = f(i, v);
- if(subans > ans) {
- ans = subans;
- si = i;
- }
- }
- vector<int> lis;
- lis.reserve(v.size()+1);
- while(si != -1) {
- lis.push_back(v[si]);
- si = nxtIndx[si];
- }
- return lis;
- }
- int main()
- {
- int n;
- cin >> n;
- vector<int> vec(n);
- for(int i=0; i<n; i++) {
- cin >> vec[i];
- }
- vector<int> lis = genLis(vec);
- for(auto it : lis) cout << it << ' ';
- cout << '\n';
- return 0;
- }
RAW Paste Data