Pagini recente » Cod sursa (job #1954911) | Cod sursa (job #1950833) | Cod sursa (job #908409) | Cod sursa (job #1041780) | Cod sursa (job #721297)
Cod sursa(job #721297)
#include <fstream>
#include <algorithm>
#define NMAx 5100
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int N,Nr=1,A[NMAx],B[NMAx],C[NMAx],Best[NMAx],T[NMAx];
inline int Length(int i) {
if(T[i]==i)
return 1;
else
return Length(T[i])+i-T[i];
}
void Solve() {
int i,j;
for(i=1;i<=N;i++) {
Best[i]=1;
T[i]=i;
for(j=i-1;j>=1;j--)
if(C[j]+1==C[i]) {
if(Best[j]+1>Best[i]) {
Best[i]=Best[j]+1;
T[i]=j;
}
else
if(Best[j]+1==Best[i]&&T[i]<j)
T[i]=j;
}
}
}
void Normalizare() {
int i,j;
sort(B+1,B+N+1);
for(i=1;i<=N;i++)
if(B[Nr]!=B[i])
B[++Nr]=B[i];
for(i=1;i<=Nr;i++)
for(j=1;j<=N;j++)
if(!C[j]&&A[j]==B[i])
C[j]=i;
}
void Citire() {
ifstream in("secv.in");
in>>N;
for(int i=1;i<=N;i++) {
in>>A[i];
B[i]=A[i];
}
in.close();
}
void Afis() {
int i,Sol;
Sol=NMAx;
for(i=Nr;i<=N;i++)
if(Best[i]==Nr)
Sol=min(Sol,Length(i));
if(Sol==NMAx)
Sol=-1;
ofstream out("secv.out");
out<<Sol<<'\n';
out.close();
}
int main() {
Citire();
Normalizare();
Solve();
Afis();
return 0;
}