Cod sursa(job #1765871)

Utilizator Y.MalmsteenB.P.M. Y.Malmsteen Data 27 septembrie 2016 05:46:21
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>

//Subsir crescator maximal

using namespace std;

const int MAXN = 100001;

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

int N, a[MAXN]; //Datele de intrare
int L[MAXN]; //L[i] = lungimea maxima a unui subsir crescator care se termina pe pozitia i
int P[MAXN]; //P[i] = pozitia primului element care este succesor al lui a[i]
             //P[i] = -1 ==> nu exista succesor
int lmax; //Lungimea maxima a unui subsir crescator
int poz;  //Pozitia primului element din subsir

void dinamica()
{
    L[N] = 1;
    P[N] = -1;
    lmax = 1;
    poz = N;
    for(int i = N - 1; i >= 1; i--)
    {
        L[i] = 1;
        P[i] = -1;
        for(int j = i + 1; j <= N; j++)
            if(a[i] < a[j] && L[i] < L[j] + 1)
            {
                L[i] = L[j] + 1;
                P[i] = j;
                if(L[i] > lmax)
                {
                    lmax = L[i];
                    poz = i;
                }
            }
    }
}

void subsir()
{
    int i = poz;
    while(i != -1)
    {
        g << a[i]<<' ';
        i = P[i];
    }
}

int main()
{
    f >> N;
    for(int i = 1; i <= N; i++)
        f >> a[i];
    dinamica();
    g << lmax << '\n';
    subsir();
    f.close();
    g.close();
    return 0;
}