Pagini recente » Borderou de evaluare (job #2959857) | Borderou de evaluare (job #941275) | Borderou de evaluare (job #2714709) | Borderou de evaluare (job #2922035) | Cod sursa (job #2171705)
#include <bits/stdc++.h>
#define INFILE "secv.in"
#define OUTFILE "secv.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int NMAX=5000;
const int INF=4*NMAX;
int N;
int Max=-1;
vector<int> vec;
map<int,int> poz;
array<int,NMAX> dp;
void AfisDp(){
for(int i=0;i<N;i++)
cout<<dp[i]<<" ";
cout<<"\n";
}
void AfisPoz(){
for(auto v:vec){
cout<<v<<" ";
cout<<poz[v]<<"\n";
}
}
void Initpoz(){
vector<int> prov(vec);
sort(prov.begin(),prov.end());
int pz=1;
for(auto x:prov){
if(poz[x]==0){
poz[x]=pz;
pz++;
}
}
//AfisPoz();
}
void Read(){
in>>N;
for(int i=1;i<=N;i++){
int x;
in>>x;
Max=max(Max,x);
vec.push_back(x);
}
}
void DP(){
for(int i=0;i<vec.size();i++){
if(poz[vec[i]]==1)
dp[i]=1;
else
dp[i]=INF;
}
for(int i=1;i<vec.size();i++){
for(int j=0;j<i;j++){
if(poz[vec[j]]==poz[vec[i]]-1){
dp[i]=min(dp[i],dp[j]+(i-j));
}
}
}
int Min=INF;
for(int i=0;i<vec.size();i++){
if(vec[i]==Max){
Min=min(Min,dp[i]);
}
}
if(Min==INF){
out<<-1;
}
else{
out<<Min<<"\n";
}
}
int main(){
Read();
Initpoz();
DP();
//AfisDp();
return 0;
}