Pagini recente » Cod sursa (job #2931134) | Cod sursa (job #814021) | Cod sursa (job #823255) | Cod sursa (job #2838189) | Cod sursa (job #617386)
Cod sursa(job #617386)
#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;
}