Cod sursa(job #1566753)

Utilizator AndreiFlorescuAndrei Florescu AndreiFlorescu Data 12 ianuarie 2016 16:00:42
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

#define MAX_N 100000

using namespace std;

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

int nr;
int sir[MAX_N + 1];
int lungime[MAX_N + 1];
int parinte[MAX_N + 1];
int rasp[MAX_N + 1];

/// Longest increasing subsequence
void lis() {
    for (int i = 1; i <= nr; i++) {
        for (int j = 1; j < i; j++) {
            if(sir[j] < sir[i]) {
                if(lungime[j] > lungime[i]) {
                    parinte[i] = j;
                    lungime[i] = lungime[j];
                }
            }
        }
        lungime[i]++;
    }
}

int main() {
    int maxim = 0, cntr = 1, element;

    // Citirea datelor
    file_in >> nr;
    for (int i = 1; i <= nr; i++) {
        file_in >> sir[i];
    }

    // Calcularea solutiei
    lis();
    for (int i = 1; i <= nr; i++) {
        if (maxim < lungime[i]) {
            maxim = lungime[i];
            element = i;
        }
    }


    // Afisarea solutiei
    file_out << maxim << "\n";

    while (element) {
        rasp[cntr++] = sir[element];
        element = parinte[element];
    }
    for (int i = cntr - 1; i > 0; i--)
        file_out << rasp[i] << " ";

    file_in.close();
    file_out.close();

    return 0;
}