Cod sursa(job #22689)

Utilizator StTwisterKerekes Felix StTwister Data 27 februarie 2007 08:39:59
Problema Culori Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <string>

#define NMAX 2*256

int N;
int C[NMAX];
int A[NMAX][NMAX];

void calc(int i, int j)
{
    if (C[i] != C[j])
    {
        A[i][j] = 0;
        return;
    }
    int S = 0;
    if (j<=i)
    {
        if (j==i)
            A[i][j] = 1;
        else
            A[i][j] = 0;
        return;
    }
    for (int k = i+1; k<j; ++k)
    {
        if (C[i+1] == C[k])
        {
            if (!A[i+1][k])
                calc(i+1,k);
            if (!A[k+1][j])
                calc(k+1,j);
            S += A[i+1][k]*A[k+1][j];
        }
    }
    A[i][j] = S;
}

int main()
{
    freopen("culori.in", "r", stdin);
    freopen("culori.out", "w", stdout);

    memset(A, 0, sizeof(A));

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

    //calc(1, 2*N-1);

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

    for (int L=2; L<2*N; L+=2)
    {
        for (int i = 1; i<=2*N-1; ++i)
        {
            int j = i+L;
            if (j<=2*N-1 && C[i]==C[j])
            {
                A[i][j] = 0;
                for (int k = i+1; k<j; ++k)
                {
                    if (C[i+1] == C[k])
                        A[i][j] += A[i+1][k]*A[k+1][j];
                }
            }
        }
    }
    printf("%d\n", A[1][2*N-1]);
}