Cod sursa(job #2104759)

Utilizator cristicretancristi cretan cristicretan Data 12 ianuarie 2018 11:11:38
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda arhivacre Marime 1.25 kb
/// LONGEST INCREASING SUBSEQUENCE
#include <iostream>
#include <fstream>
#include <utility>
#include <algorithm>
#include <map>
#include <sstream>
#include <memory>
#include <cstring>
#define NMax 100001
///#define f cin
///#define g cout
using namespace std;

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

int n, a[NMax], temp[NMax], maxindex, sol[NMax], ans[NMax], foo;

int main()
{
    f >> n;
    for(int i = 1; i <= n; ++i)
    {
        f >> a[i];
        temp[i] = 1; /// fac cel mai mare subsir crescator ca fiind 1 pt fiecare element
    }
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            if(a[j] < a[i])
            {
                temp[i] = max(temp[i], temp[j] + 1); /// daca a[j] < a[i] atunci cel mai mare subsir crescator la pozitia i va fi maximul dintre pozitia aia si pozitia lui j + 1
                sol[i] = j;
            }

    for(int i = 1; i <= n; ++i)
        if(temp[i] > temp[maxindex]) maxindex = i;

    g << temp[maxindex] << '\n';

    int t = maxindex, newt = maxindex;
    do
    {
        t = newt;
        ans[++foo] = a[t];
        newt = sol[t];
    }while(t != newt);

    for(int i = foo - 1; i >= 1; --i)
        g << ans[i] << " ";
    return 0;
}