Cod sursa(job #1009578)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 13 octombrie 2013 15:29:22
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>

int a[100001], b[100001], t[100001], l[100001], n, lsmax;

void Citire()
{
    FILE *F = fopen("scmax.in", "r");
    fscanf(F, "%d", &n);
    for (int i = 1; i <= n; ++i)
        fscanf(F, "%d", &a[i]);
    fclose(F);
}

void Subsir()
{
    int kmax, lmax;
    t[1] = 0;
    l[1] = 1;
    for (int i = 2; i <= n; ++i)
    {
        kmax = lmax = 0;
        for (int k = 1; k < i; ++k)
            if (a[k] < a[i] && l[k] > lmax)
            {
                kmax = k;
                lmax = l[k];
            }
        t[i] = kmax;
        l[i] = lmax + 1;
    }
}

void Reconstituire()
{
    int imax;
    for (int i = 1; i <= n; ++i)
        if (l[i] > lsmax)
        {
            lsmax = l[i];
            imax = i;
        }
    for (int i = lsmax; i >= 1; --i)
    {
        b[i] = a[imax];
        imax = t[imax];
    }
}

void Afisare()
{
    FILE *G = fopen("scmax.out", "w");
    fprintf(G, "%d\n", lsmax);
    for (int i = 1; i <= lsmax; ++i)
        fprintf(G, "%d ", b[i]);
    fclose(G);
}

int main()
{
    Citire();
    Subsir();
    Reconstituire();
    Afisare();
    return 0;
}