Cod sursa(job #2777712)

Utilizator puica2018Puica Andrei puica2018 Data 23 septembrie 2021 22:37:55
Problema Secv Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("secv.in");
ofstream fout("secv.out");

int n;
int a[5005],as[5005],as1[5005],k,dp[5005],cnt[5005];

int main()
{
    fin>>n;
    int i;
    for(i=1; i<=n; i++)
        fin>>a[i];
    for(i=1; i<=n; i++)
        as[i]=a[i];
    sort(as+1,as+n+1);
    for(i=1; i<=n; i++)
        if(as[i]!=as[i-1])
            as1[++k]=as[i];
    for(i=1; i<=n; i++)
    {
        int st=1,dr=k,mij;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(as1[mij]==a[i])
            {
                a[i]=mij;
                break;
            }
            if(as1[mij]<a[i])
                st=mij+1;
            else
                dr=mij-1;
        }
    }
    for(i=1; i<=n; i++)
        cnt[i]=n+1;
    for(i=1; i<=n; i++)
        if(a[i]==1)
            dp[i]=cnt[i]=1;
    for(i=1; i<=n; i++)
    {
        for(int j=1; j<i; j++)
        {
            if(a[j]==a[i]-1)
            {
                dp[i]=(dp[i],dp[j]+1);
                cnt[i]=min(cnt[i],cnt[j]+i-j);
            }
        }
    }
    int minim=n+1;
    for(i=1; i<=n; i++)
        if(dp[i]==k)
            minim=min(minim,cnt[i]);
    if(minim==n+1)
    {
        fout<<"-1\n";
        return 0;
    }
    fout<<minim<<"\n";
    return 0;
}