Cod sursa(job #617386)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 14 octombrie 2011 19:18:51
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <set>

#define NMax 5005

using namespace std;

int N, DP[NMax], V[NMax], iMax, jMax, LMax;
set <int> Subsequence;

inline int Max (int a, int b)
{
    if (a>b)
    {
        return a;
    }
    return b;
}

bool Valid ()
{
    for (int i=1; i<=N; ++i)
    {
        if (Subsequence.find (V[i])==Subsequence.end ())
        {
            return false;
        }
    }
    return true;
}

void Read ()
{
    freopen ("secv.in", "r", stdin);
    scanf ("%d", &N);
    for (int i=1; i<=N; ++i)
    {
        scanf ("%d", &V[i]);
    }
}

void Print ()
{
    freopen ("secv.out", "w", stdout);
    printf ("%d\n", LMax);
}

int main()
{
    Read ();
    for (int i=1; i<=N; ++i)
    {
        DP[i]=1;
        for (int j=i-1; j>0; --j)
        {
            if (V[j]<V[i])
            {
                DP[i]=Max (DP[i], DP[j]+1);
            }
        }
        if (DP[i]>LMax)
        {
            LMax=DP[i];
            jMax=i;
        }
    }
    int CurrentMax=jMax;
    Subsequence.insert (V[CurrentMax]);
    for (int i=jMax-1; i>0; --i)
    {
        if (V[i]<V[CurrentMax] and DP[i]+1==DP[CurrentMax])
        {
            CurrentMax=i;
            Subsequence.insert (V[CurrentMax]);
            if (DP[i]==1)
            {
                iMax=i;
                break;
            }
        }
    }
    if (Valid ())
    {
        LMax=jMax-iMax+1;
    }
    else
    {
        LMax=-1;
    }
    Print ();
    return 0;
}