Cod sursa(job #1838586)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 1 ianuarie 2017 13:35:22
Problema Culori Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define MAXN 256
#define MAXSIZE 512
#define MOD 9901
using namespace std;

int culori[MAXSIZE + 1];
vector <int> P[MAXN + 1];
int ind[MAXSIZE + 1];

int D[MAXSIZE + 1][MAXSIZE + 1];
int aup;

inline int sumMOD(int a, int b) {
    return a + b - ((a + b) >= MOD ? MOD : 0);
}

inline int prodMOD(int a, int b) {
    aup = a * b;
    if (aup >= MOD)
        aup %= MOD;

    return aup;
}

int solve(int st, int dr) {
    if (D[st][dr] != -1)
        return D[st][dr];

    if (culori[st] != culori[dr])
        return D[st][dr] = 0;

    if ((dr - st) & 1)
        return D[st][dr] = 0;

    if (st == dr)
        return D[st][dr] = 1;

    int cul = culori[st], pst = ind[st], pdr = ind[dr];
    D[st][dr] = solve(st + 1, dr - 1);

    for (int i = pst + 1 ; i < pdr ; ++i)
        D[st][dr] = sumMOD(D[st][dr], prodMOD(solve(st + 1, P[cul][i] - 1), solve(P[cul][i], dr)));

    return D[st][dr];

}

int main () {
    ifstream cin("culori.in");
    ofstream cout("culori.out");

    int n;
    cin >> n;

    for (int i = 1 ; i < (2 * n) ; ++i) {
        cin >> culori[i];
        P[culori[i]].push_back(i);

        ind[i] = P[culori[i]].size() - 1;
    }

    memset(D, -1, sizeof(D));

    cout << solve(1, (2 * n) - 1) << "\n";
    return 0;
}