Cod sursa(job #2171705)

Utilizator catalinlupCatalin Lupau catalinlup Data 15 martie 2018 13:14:50
Problema Secv Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#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;
}