Cod sursa(job #2451633)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 27 august 2019 15:17:56
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 5010;

int N, M;
int v[NMAX], cp[NMAX], nor[NMAX];
int dp[2][NMAX];

int main(){

    freopen("secv.in", "r", stdin);
    freopen("secv.out", "w", stdout);

    scanf("%d", &M);
    for(int i = 1; i <= M; i++){
        scanf("%d", &v[i]);
        cp[i] = v[i];
    }
    sort(cp, cp + M + 1);
    for(int i = 1; i <= M; i++){
        while(cp[i] == cp[i + 1] && i <= M) i++;
        nor[++N] = cp[i];
    }
    if(N == 1){
        printf("1");
        return 0;
    }
    int line1, line2;
    int ok = 0;
    for(int i = 1; i <= M; i++){
        if(v[i] == nor[1])
            dp[0][i] = 1, ok = 1;
        else if(ok) dp[0][i] = dp[0][i - 1] + 1;
    }
    for(int i = 2; i <= N; i++){
        ok = 0;
        line1 = (i + 1) % 2;
        line2 = i % 2;
        for(int j = 1; j <= M; j++){
            if(v[j] == nor[i] && dp[line2][j - 1] != 0)
                dp[line1][j] = dp[line2][j - 1] + 1, ok = 1;
            else if(ok) dp[line1][j] = dp[line1][j - 1] + 1;
            else dp[line1][j] = 0;
        }
    }
    int ans = 2e9;
    for(int i = 1; i <= M; i++){
        if(dp[line1][i] != 0)
            ans = min(ans, dp[line1][i]);
    }
    if(ans != 2e9) printf("%d", ans);
    else printf("-1");

    return 0;
}