Cod sursa(job #1516695)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 3 noiembrie 2015 14:01:30
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<iostream>
#include<fstream>

using namespace std;

ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

int a[100003], lis[100003], sir[100003], n, maxi, maxim;

void Citire()
{
    fin >> n;
    for (int i=1; i<=n; i++)
        fin >> a[i];
}

void LIS()
{
    int i,j;
    /// lis[i] = 1 + max {lis[j] / j<i cu proprietatea ca a[j] < a[i] }
    lis[1] = 1;

    for (i=2; i<=n; i++)
    {
        maxi = 0;
        for (j=1; j<i; j++)
        {
            if (a[j] < a[i] && lis[j] > maxi)
                maxi = lis[j];
        }
        if (maxi == 0) lis[i] = 1;
        else           lis[i] = maxi + 1;
    }

    for (i=1; i<=n; i++)
        cout << lis[i] << " ";
}

void Afisare()
{
    int i, poz, m;
    /// mai intai sa gasim maximul
    maxi = 0;
    for (i=1; i<=n; i++)
    {
        if (lis[i] > maxi)
        {
            maxi = lis[i];
            poz = i;
        }
    }

    /// am reperat unde se termina longest increasing "sir"
    fout << maxi << "\n";  /// am afisat lungimea, acum sa reconst. sirul
    /// ma duc spre stanga
    m = maxi - 1;
    maxim = maxi;
    i = poz;
    sir[maxi] = a[i];
    while (i>=1 && m>=1)
    {
         /// sunt la poz si ma duc spre stanga pana gasesc un a[j] < a[i] cu lis[j] = m;
         while (!(a[i] < a[poz] && lis[i] == m))
         {
             i--;
         }

         sir[--maxi] = a[i];
         poz = i;
         m = m -1;
    }
}

void Printing()
{
    for (int i=1; i<=maxim; i++)
        fout << sir[i] << " ";
    fout << "\n";
}

int main ()
{
    Citire();
    LIS();
    Afisare();
    Printing();
    fin.close();
    fout.close();
    return 0;
}