Cod sursa(job #1411362)

Utilizator remus88Neatu Remus Mihai remus88 Data 31 martie 2015 17:33:58
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
//subsir crescator maximal
// O(N^2)

/* l[i] = lungimea celui mai SCMAX format DOAR cu primele i
elemente si care se TERMINA SIGUR cu v[i];
voi gasi o pozitie j < i unde an un subsir .... , v[j]
daca v[j] < v[i] pot sa fac ....,v[j],v[i] => l[i]=max(l[i], l[j]+1);
   ante[i] =  este acea pozitie j din sirul de mai sus */
#include <fstream>
#define NMAX 100099
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");

int n,nr,v[NMAX];
int l[NMAX],maxx,poz,ante[NMAX],fin[NMAX];

int main()
{
    f>>n;
    for (int i=1; i<=n; ++i)
    {
        f>>v[i];
        l[i]=1;
    }
    l[1]=1; //
    for(int i=2; i<=n; ++i)
        for (int j=1; j<=i-1; ++j)
        if (v[j]<v[i])
        {
            if (l[i]<l[j]+1)
            {
                l[i]=l[j]+1;
                ante[i]=j;
            }
        }
    maxx=1;
    for (int i=1; i<=n; ++i)
        if (l[i]>maxx)
        {
            maxx=l[i];
            poz=i;
        }
    nr=0;
    while (poz!=0)
    {
        ++nr;
        fin[nr]=v[poz];
        // sirul este  ..., v[ante[poz]], v[poz], ...
        // merg spre stanga
        poz=ante[poz];
    }
    g<<maxx<<'\n';
    for (int i=nr; i>=1; --i) g<<fin[i]<<' ';
    g<<'\n';
    g.close(); f.close();
    return 0;
}