Cod sursa(job #891761)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 25 februarie 2013 19:41:00
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
// Subsir crescator maximal - complexitate O(n^2);
#include <iostream>
#include <algorithm>
#include <fstream>

using namespace std;

int n, a[100010], best[100010], pred[100010], sol, pozsol, vsol[100010], nvsol;
// best[i] = lungimea celui mai lung subsir care se termina pe pozitia i
// pred[i] = predecesorul elementului i

inline void Read()
{
    ifstream f ("scmax.in");
    f>>n;
    int i;
    for (i=1; i<=n; i++)
        f>>a[i];
    f.close();
}

inline void LIS()
{
    int i, j, pos, maxim;
    for (i=1; i<=n; i++)
    {
        pos = -1;
        maxim = 0;
        for (j=1; j<i; j++)
            if (a[j] < a[i] && best[j] > maxim)
            {
                maxim = best[j];
                pos = j;
            }
        best[i] = maxim + 1;
        pred[i] = pos;
        if (best[i] > sol)
        {
            sol = best[i];
            pozsol = i;
        }
    }
}

inline void Write()
{
    ofstream g("scmax.out");
    g<<sol<<"\n";
    do
    {
        vsol[++nvsol] = a[pozsol];
        pozsol = pred[pozsol];
    } while (pozsol != -1);
    for (int i=nvsol; i; i--)
        g<<vsol[i]<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    LIS();
    Write();
    return 0;
}