Pagini recente » Cod sursa (job #2222645) | Cod sursa (job #1438525) | Cod sursa (job #1761449) | Cod sursa (job #738249) | Cod sursa (job #1755413)
#include<bits/stdc++.h>
#define maxN 5005
#define INF 10000
using namespace std;
int n,v[maxN],x,best,maxim,pr[maxN],da,minim,l;
int s,ld,mid,sol,ls,sol1,last[maxN],lmin[maxN];
vector<int> a;
short d[maxN][maxN],poz[maxN][maxN];
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
//fin>>n;
scanf("%d",&n);
a.push_back(0);
// fin>>v[1];
scanf("%d",&v[1]);
a.push_back(v[1]);
da=1;
for(int i=2;i<=n;i++)
{
//fin>>v[i];
scanf("%d",&v[i]);
ls=1;
ld=da;
sol=0;
sol1=0;
while (ls<=ld)
{
mid=(ls+ld)>>1;
if (a[mid]==v[i])
{
sol=mid;
ls=ld+1;
}
else
if (a[mid]>v[i])
{
ld=mid-1;
}
else
{
sol1=mid;
ls=mid+1;
}
}
if (!sol)
{
da++;
a.insert(a.begin()+sol1+1,v[i]);
}
}
sort(a.begin(),a.end());
for(int j=1;j<=n;j++)
{
ls=1;
ld=da;
sol=0;
while(ls<=ld)
{
mid=(ls+ld)>>1;
if (a[mid]==v[j])
{
sol=mid;
ls=ld+1;
}
else
if (a[mid]>v[j])
{
ld=mid-1;
}
else ls=mid+1;
}
pr[j]=sol;
}
for(int i=1;i<=n;i++)
{
last[i]=0;
lmin[i]=INF;
}
if (v[1]==a[1])
{
d[1][1]=1;
poz[1][1]=1;
last[1]=1;
lmin[1]=1;
}
for(int i=2;i<=n;i++)
{
if (v[i]==a[1])
{
d[i][1]=1;
poz[i][1]=i;
last[1]=i;
lmin[1]=1;
}
else
{
x=pr[i]-1;
if (last[pr[i]]) minim=lmin[pr[i]]+i-poz[last[pr[i]]][pr[i]];
else minim=INF;
for(int j=last[x];j<i;j++)
{
if (d[j][x])
{
l=d[j][x]+(i-poz[j][x]);
minim=min(minim,l);
}
}
if (minim==INF)
{
d[i][pr[i]]=0;
lmin[pr[i]]=INF;
last[pr[i]]=i;
}
else
{
d[i][pr[i]]=minim;
poz[i][pr[i]]=i;
lmin[pr[i]]=minim;
last[pr[i]]=i;
}
}
}
best=INF;
for(int i=1;i<=n;i++)
{
if (d[i][da]) best=min(best,d[i][da]);
}
if (best!=INF) printf("%d\n",best);
else printf("-1\n");
return 0;
}