Cod sursa(job #18551)

Utilizator sims_glAlexandru Simion sims_gl Data 18 februarie 2007 12:36:39
Problema Culori Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.16 kb
#include <stdio.h>

#define nm 520

void find(int, int);

int n, a[nm], mat[nm][nm], c[nm][nm];

int main()
{
	int i, j;

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

	scanf("%d", &n);

    for (i = 1; i <= 2 * n - 1; ++i)
    {
    	scanf("%d", &a[i]);
        mat[a[i]][++mat[a[i]][0]] = i;
    }

    for (i = 1; i <= 2 * n - 1; ++i)
    	for (j = i; j <= 2 * n - 1; ++j)
        	c[i][j] = -1;

    find(1, 2 * n - 1);

    printf("%d\n", c[1][2 * n - 1]);

	return 0;
}

void find(int x, int y)
{
	int i;

    if (a[x] != a[y])
    {
    	c[x][y] = 0;
        return;
    }

    if (x == y)
    {
    	c[x][y] = 1;
        return;
    }

    if (c[x + 1][y - 1] == -1)
    	find(x + 1, y - 1);

    c[x][y] = c[x + 1][y - 1];

	for (i = 1; i <= mat[a[x]][0]; ++i)
    	if (mat[a[x]][i] > x && mat[a[x]][i] < y)
        {
        	if (c[x + 1][mat[a[x]][i] - 1] == -1)
            	find(x + 1, mat[a[x]][i] - 1);

            if (c[mat[a[x]][i]][y] == -1)
            	find(mat[a[x]][i], y);
                
	        c[x][y] += c[x + 1][mat[a[x]][i] - 1] * c[mat[a[x]][i]][y];
        }
}