Cod sursa(job #21429)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 23 februarie 2007 15:00:36
Problema Culori Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <cstring>

const int NMAX = 512;
const int MOD = 9901;

int N;
int A[NMAX];
int D[NMAX][NMAX], ND[NMAX];
int DP[NMAX][NMAX];

void read() {
	FILE *fin = fopen("culori.in", "rt");
	int i;

	fscanf(fin, " %d", &N);

	N = 2 * N - 1;

	for (i = 0; i < N; ++i)
		fscanf(fin, " %d", A + i);

	fclose(fin);
}

void init() {
	int i, j;

	for (i = 0; i < N; ++i)
		for (j = i; j < N; ++j)
			if (A[i] == A[j])
				D[i][ND[i]++] = j;
}

int dinamica(int st, int dr) {
	if (DP[st][dr] != -1) return DP[st][dr];
	if (st == dr) return DP[st][dr] = 1;
	if (A[st] != A[dr]) return DP[st][dr] = 0;

	int i, cs;
	int rez = 0;

	cs = st + 1;
	for (i = 0; i < ND[cs] && D[cs][i] <= dr; ++i)
		rez = (rez + dinamica(cs, D[cs][i]) * dinamica(D[cs][i] + 1, dr)) % MOD;	
	
	return DP[st][dr] = rez;
}

void write() {
	FILE *fout = fopen("culori.out", "wt");

	memset(DP, 0xff, sizeof(DP));

	init();

	fprintf(fout, "%d\n", dinamica(0, N - 1));

	fclose(fout);
}

int main() {

	read();

	write();

	return 0;
}