Cod sursa(job #1464826)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 25 iulie 2015 12:29:28
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <set>
#include <cmath>
#include <climits>
#include <list>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <map>
#include <algorithm>
#define nmax 10

using namespace std;

void afis (int** m, int n, int k) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++)
            cout << m[i][j] << " ";
        cout << "\n";
    }
    cout << "\n";
}

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

    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    int* v = new int[n + 1];
    int** m = new int*[n + 1];
    for (int i = 0; i <= n; i++)
        m[i] = new int[n + 1];
    set<int> oc;
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
        oc.insert(v[i]);
    }
    set<int>::iterator it;
   /* for (it = oc.begin(); it != oc.end(); it++) {
        cout << *it << " ";
    }*/
    it = oc.begin();
    int nr = *it;
    for (int i = 1; i <= n; i++) {
        if (v[i] == nr) {
            m[1][i] = 1;
        } else {
            m[1][i] = 0;
        }
    }
  //  afis(m, oc.size(), n);
    int k = 2;
    it++;
    for (; it != oc.end(); it++, k++) {
        bool gasit = false;
        nr = *it;
        for (int i = 1; i <= n; i++) {
            if (v[i] == nr) {
                bool aici = false;
                for (int j = i - 1; j > 0; j--) {
                    if (m[k - 1][j] != 0) {
                        m[k][i] = m[k - 1][j] + i - j;
                        gasit = true;
                        aici = true;
                        break;
                    }
                }
                if (!aici) {
                    m[k][i] = 0;
                }
            } else {
                m[k][i] = 0;
            }
        }
      //  afis(m, oc.size(), n);
        if (!gasit) {
            cout << -1;
            break;
        }
    }
    int ans = n;
    k--;
    for (int i = 1; i <= n; i++) {
        if (m[k][i] < ans && m[k][i] != 0) {
            ans = m[k][i];
        }
    }
    cout << ans;

    return 0;
}