Cod sursa(job #18259)

Utilizator wefgefAndrei Grigorean wefgef Data 18 februarie 2007 11:04:45
Problema Culori Scor 48
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 0.82 kb
#include <cstdio>

#define mod 9901
#define Nmax 512

int n, v[Nmax];
int c[Nmax][Nmax];
char viz[Nmax][Nmax];

void readdata()
{
	freopen("culori.in", "r", stdin);
	freopen("culori.out", "w", stdout);
	
	scanf("%d", &n);
	for (int i = 1; i <= 2*n-1; ++i)
		scanf("%d", &v[i]);
}

int sol(int st, int dr)
{
	int rez = 0, i, aux;
	
	if (st > dr) return 1;
	if (viz[st][dr]) return c[st][dr];
	
	if (v[st] != v[dr])
	{
		viz[st][dr] = 1;
		return 0;
	}
	
	if (st == dr-1) return 0;
	
	viz[st][dr] = 1;
	for (i = st+2; i < dr-1; ++i)
	if (v[i] == v[st])
	{
		aux = sol(st+1, i-1) * sol(i, dr);
		aux %= mod;
		rez += aux;
		rez %= mod;
	}
	rez += sol(st+1, dr-1);
	rez %= mod;
	c[st][dr] = rez;
	return c[st][dr];
}

int main()
{
	readdata();
	printf("%d\n", sol(1, 2*n-1));
	return 0;
}