Cod sursa(job #876747)

Utilizator Catah15Catalin Haidau Catah15 Data 12 februarie 2013 08:31:02
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

#define maxN 5005
#define inf (1 << 30)

int A[maxN], B[maxN];
int dp[maxN];


int main()
{
    freopen ("secv.in", "r", stdin);
    freopen ("secv.out", "w", stdout);

    int N;
    scanf ("%d", &N);

    for (int i = 1; i <= N; ++ i)
    {
        scanf ("%d", &A[i]);

        bool ok = false;
        for (int j = 0; j <= B[0]; ++ j)
            if (A[i] == B[j])
            {
                ok = true;
                break;
            }

        if (! ok) B[++ B[0]] = A[i];
    }

    sort (B + 1, B + B[0] + 1);

    for (int i = 1; i <= N; ++ i)
    {
        dp[i] = inf;

        if (A[i] == B[1])
        {
            dp[i] = 1;
            continue;
        }

        int Last = 0;
        for (int j = 1; j <= B[0]; ++ j)
            if (B[j] == A[i])
            {
                Last = B[j - 1];
                break;
            }

        for (int j = 1; j < i; ++ j)
            if (A[j] == Last) dp[i] = min (dp[i], dp[j] +  (i - j));
    }

    int sol = inf;
    for (int i = 1; i <= N; ++ i)
        if (A[i] == B[B[0]] && dp[i] != inf) sol = min (sol, dp[i]);

    if (sol != inf) printf ("%d", sol);
    else printf ("-1");

    return 0;
}