Cod sursa(job #1961938)

Utilizator BugirosRobert Bugiros Data 11 aprilie 2017 14:34:53
Problema Culori Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
using namespace std;

ifstream in("culori.in");
ofstream out("culori.out");

const int MAXN = 260;
const int MODULO = 9901;

int culori[2 * MAXN - 1];

int n;

void citire()
{
    in >> n;
    n = 2 * n - 1;
    for (int i = 1;i <= n;++i)
        in >> culori[i];
}


//d[i][j] - numarul arborilor care ar putea sa dea subsecventa de la i la j in vectorul de culori
int d[2 * MAXN - 1][2 * MAXN - 1];

void dinamica()
{
    for (int i = 1;i <= n;++i)
        d[i][i] = 1;//radacina

    for (int i = n - 1;i >= 1;--i)
        for (int j = i + 1;j <= n;++j)
            if ((j - i + 1) % 2 == 1 && culori[i] == culori[j])//orice parcurgere euler are lungime impara
            //de asemenea, nu au sens parcurgerile care nu se intorc macar intr-un nod de aceeasi culoare
            {
                long long nr = 0;
                for (int k = i + 1;k < j;++k)
                    if (culori[i + 1] == culori[k])
                        nr += d[i + 1][k] * d[k + 1][j];
                d[i][j] = nr % MODULO;
            }
}

int main()
{
    citire();
    dinamica();
    out << d[1][n] << '\n';
    return 0;
}