Cod sursa(job #3233792)

Utilizator luliusBratu Iulian lulius Data 4 iunie 2024 21:08:16
Problema Subsir crescator maximal Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;


ifstream in("scmax.in");
ofstream out("scmax.out");

int main()
{
    // vector<int> V = {0, 15, 16, 17, 1, 2};
    
    // int N = V.size() - 1;
    
    vector<int> V;
    V.push_back(0);
    int N;
    
    in >> N; 
    for(int k, i = 1; i <= N; ++i) {
        in >> k;
        V.push_back(k);
    }
    
    vector<int> dp(N + 1, 0);
    
    
    
    for(int i = 1; i <= N; ++i) {
        int maxim = 0;
        for(int j = 1; j <= i; ++j) {
            if(dp[j] > maxim && V[j] < V[i]) {
                maxim = dp[j];
            } 
        }
        dp[i] = 1 + maxim;
    }
    
    for(auto a : dp) {
        cout << a << " ";
    }
    cout << endl << endl;
    
    int mx = *max_element(dp.begin(), dp.end());
    out << mx << endl;
    
    vector<int> sol;
    int last = 0;
    
    for(int i = 0; i <= N; ++i) {
        if(dp[i] < dp[i + 1]) {
            
            if(V[i + 1] > last) {
                sol.push_back(V[i + 1]);
                last = V[i + 1];
            } else {
                sol.clear();
                
                sol.push_back(V[i + 1]);
                for(int k = i + 1; k >= 1; --k) {
                    if(V[k] < V[i + 1]) {
                        sol.push_back(V[k]);
                    }
                }
                
                reverse(sol.begin(), sol.end());
            }
            
        } else if (dp[i] > dp[i + 1] && dp[i] == mx){
            break;
        }
    }
    
    for(auto a : sol) {
        out << a << " ";
    }
    return 0;
}