Pagini recente » Cod sursa (job #1133974) | Cod sursa (job #2482756) | Cod sursa (job #301834) | Cod sursa (job #917543) | Cod sursa (job #1961938)
#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;
}