Cod sursa(job #21420)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 23 februarie 2007 14:51:52
Problema Culori Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include <cstring>

const int NMAX = 256;
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 (st == dr) return 1;
	if (DP[st][dr] != -1) return DP[st][dr];

	int i;
	int &rez = DP[st][dr];

	if (A[st] != A[dr]) return rez = 0;

	rez = 0;
	
	++st;
	for (i = 0; i < ND[st] && D[st][i] <= dr; ++i)
		rez = (rez + dinamica(st, D[st][i]) * dinamica(D[st][i] + 1, dr)) % MOD;	
	
	return 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;
}