Pagini recente » Cod sursa (job #161442) | Cod sursa (job #1907191) | Cod sursa (job #492145) | Cod sursa (job #1269971) | Cod sursa (job #617397)
Cod sursa(job #617397)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMax 5005
using namespace std;
int N, DP[NMax], V[NMax], LMax, F[NMax], S=NMax;
vector <int> Sequence, Vector;
inline int Min (int a, int b)
{
if (a<b)
{
return a;
}
return b;
}
bool Valid ()
{
int iMax=N;
for (int i=N; i>0; --i)
{
if (DP[i]==LMax)
{
iMax=i;
break;
}
}
for (int i=iMax; i>0; i=F[i])
{
Sequence.push_back (V[i]);
}
sort (Sequence.begin (), Sequence.end ());
sort (V+1, V+N+1);
V[0]=-1;
for (int i=1; i<=N; ++i)
{
if (V[i]!=V[i-1])
{
Vector.push_back (V[i]);
}
}
for (unsigned i=0; i<Sequence.size (); ++i)
{
if (Sequence[i]!=Vector[i])
{
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", S);
}
void LIS ()
{
for (int i=1; i<=N; ++i)
{
DP[i]=1;
for (int j=i-1; j>0; --j)
{
if (V[j]<V[i])
{
if (DP[j]+1>DP[i])
{
DP[i]=DP[j]+1;
F[i]=j;
}
}
}
if (DP[i]>LMax)
{
LMax=DP[i];
}
}
}
int Length (int i)
{
if (DP[i]==1)
{
return 1;
}
return Length (F[i])+i-F[i];
}
int main()
{
Read ();
LIS ();
if (!Valid ())
{
S=-1;
Print ();
return 0;
}
for (int i=N; i>0; --i)
{
if (DP[i]==LMax)
{
S=Min (S, Length (i));
}
}
Print ();
return 0;
}