Cod sursa(job #18515)

Utilizator astronomyAirinei Adrian astronomy Data 18 februarie 2007 12:30:38
Problema Ghiozdan Scor 0
Compilator c Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.16 kb
#include <stdio.h>
#include <string.h>

#define MAXN 512
#define MOD 9901

int N, C[MAXN];
int A[2][MAXN][MAXN];

int solve(void)
{
    int nr, i, j, u, v, M, r;

    u = 0, v = 1;

    for(i = 1; i <= 2*N-1; i++)
        A[u][i][i] = 1;

    M = 2*N-1;
    
    for(nr = 2; nr <= N; nr++)
    {
        memset(A[v], 0, sizeof(A[v]));
        
        for(i = M; i >= 1; i--)
         for(j = i; j <= M; j++)
         {
            A[v][i][j] = A[u][i][j];
            // pun fix nr
            if(i+(nr<<1)-2 > j)
                continue ;
            r = 0;
            if(C[i] == C[i+(nr<<1)-2] && C[i+1] == C[i+(nr<<1)-3])
                r = A[u][i+1][i+(nr<<1)-3]*A[v][i+(nr<<1)-2][j];
            A[v][i][j] += r;
            if(A[v][i][j] >= MOD)
                A[v][i][j] %= MOD;
         }

        u ^= 1, v ^= 1;
    }

    return A[u][1][M];
}

int main(void)
{
    freopen("culori.in", "rt", stdin);
    freopen("culori.out", "wt", stdout);

    int i;

    scanf("%d\n", &N);

    for(i = 1; i <= 2*N-1; i++)
        scanf("%d ", &C[i]);

    printf("%d\n", solve());

    return 0;
}