Cod sursa(job #2961087)

Utilizator Alex18maiAlex Enache Alex18mai Data 5 ianuarie 2023 19:14:51
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>

using namespace std;

// ifstream cin("input");ofstream cout("output");
ifstream cin("scmax.in");ofstream cout("scmax.out");

// SOLUTIE O(N^2)

vector<int> numere;
vector<int> dp; // dp[i] = lungimea celui mai lung subsir strict crescator care se termina in i
vector<int> inainte;

int main(){
    int n;
    cin>>n;

    numere.resize(n+1);
    dp.resize(n+1, 0);
    inainte.resize(n+1);

    for (int i=1; i<=n; i++){
        cin>>numere[i];
    }

    numere[0] = 0;
    dp[0] = 0; // start - pe pozitia 0 nu am niciun element in subsir

    for (int i=1; i<=n; i++){
        for (int j=0; j<i; j++){
            if (numere[j] < numere[i]){ // am gasit un numar mai mic
                if (dp[j] + 1 > dp[i]){ // pot face un subsir mai lung
                    dp[i] = dp[j] + 1; // imi retin lungimea maxima
                    inainte[i] = j; // imi retin de unde am venit
                }
            }
        }
    }

    int ultimaPozitie = 0;
    for (int i=1; i<=n; i++){
        if (dp[i] > dp[ultimaPozitie]){
            ultimaPozitie = i; // cea mai buna ultima pozitie
        }
    }

    vector<int> raspuns;
    while (ultimaPozitie != 0){
        raspuns.push_back(numere[ultimaPozitie]);
        ultimaPozitie = inainte[ultimaPozitie];
    }

    reverse(raspuns.begin(), raspuns.end());

    cout<<raspuns.size()<<'\n';
    for (auto &x : raspuns){
        cout<<x<<" ";
    }
    cout<<'\n';
}