Mai intai trebuie sa te autentifici.
Cod sursa(job #459455)
Utilizator | Data | 29 mai 2010 19:59:07 | |
---|---|---|---|
Problema | Secv | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.15 kb |
#include<cstdio>
#include<algorithm>
using namespace std;
int n,mr,rasp,a[5001],b[5001],c[5001],m[2][5001];
void set(int x,int y)
{
for(int i=1;i<=n;i++)
if(b[i]==x)
a[i]=y;
}
int minim(int x,int y)
{
if(x==-1 && y!=-1)
return y;
if(y==-1 && x!=-1)
return x;
return x<y?x:y;
}
int maxim(int x,int y)
{
return x>y?x:y;
}
int main()
{
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
c[i]=b[i];
}
sort(c+1,c+n+1);
mr=0;
c[0]=-1;
for(int i=1;i<=n;i++)
if(c[i]!=c[i-1])
{
mr++;
set(c[i],mr);
}
for(int j=1;j<=n;j++)
m[0][j]=0;
for(int i=1;i<=mr;i++)
{
m[i&1][0]=-1;
for(int j=1;j<=n;j++)
if(a[j]==i)
{
int q=minim(m[(i-1)&1][j-1],m[i&1][j-1]);
if(q==-1)
m[i&1][j]=-1;
else
m[i&1][j]=q+1;
}
else
{
int q=m[i&1][j-1];
if(q==-1)
m[i&1][j]=-1;
else
m[i&1][j]=q+1;
}
}
rasp=5002;
for(int j=1;j<=n;j++)
if(m[mr&1][j]!=-1)
rasp=minim(rasp,m[mr&1][j]);
if(rasp==5002) rasp=-1;
printf("%d",rasp);
return 0;
}