Pagini recente » Cod sursa (job #2799668) | Cod sursa (job #1658514) | Cod sursa (job #2000506) | Cod sursa (job #2806178) | Cod sursa (job #21429)
Cod sursa(job #21429)
#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;
}