Cod sursa(job #17085)

Utilizator azotlichidAdrian Vladu azotlichid Data 14 februarie 2007 20:25:48
Problema Culori Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>

#define FOR(i, a, b) for (i = (a); i <= (b); i ++)

#define NMAX 512
#define MODULO 9901

int a[NMAX];
int ok[NMAX][NMAX];
int N, i, l, b, e;

int main(void)
{
    freopen("culori.in", "r", stdin);
    freopen("culori.out", "w", stdout);
    scanf("%d", &N);
    FOR(i, 0, 2 * N - 2)
        assert(scanf("%d", &a[i]) != EOF);

    memset(ok, 0, sizeof(ok));
    FOR(i, 0, 2 * N - 2) ok[i][i] = 1;
    FOR(i, 0, 2 * N - 4) if (a[i] == a[i + 2]) ok[i][i + 2] = 1;
    
    FOR(l, 3, 2 * N - 2)
        FOR(b, 0, 2 * N - 2 - l)
            if (a[b] == a[e = b + l])
            {
                register int *x = &(ok[b + 1][b]), *y = &(ok[b + 1][e]);
                FOR(i, b + 2, e)
                {
                    ++ x, y += NMAX;
                    if (a[b] == a[i])
                        (ok[b][e] += (*x) * (*y)) %= MODULO;

                    
//                    if (a[b] == a[i])
//                        (ok[b][e] += ok[b + 1][i - 1] * ok[i][e]) %= MODULO;
                }

            }

    printf("%d\n", ok[0][2 * N - 2]);
    return 0;
}