Cod sursa(job #2777708)

Utilizator puica2018Puica Andrei puica2018 Data 23 septembrie 2021 22:33:15
Problema Secv Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 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]=max(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(a[i]==k && dp[i]==k)
            minim=min(minim,cnt[i]);
    fout<<minim<<"\n";
    return 0;
}