Pagini recente » Cod sursa (job #77630) | Cod sursa (job #2331804) | Cod sursa (job #1272682) | Cod sursa (job #2481015) | Cod sursa (job #21420)
Cod sursa(job #21420)
#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;
}