Cod sursa(job #18554)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 18 februarie 2007 12:36:48
Problema Culori Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 0.89 kb
#include<stdio.h>
#include<string.h>

#define NMAX 512
#define Q 9901

void read();

int N, A[NMAX], V[NMAX][NMAX], prev[NMAX];

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

     read();
	return 0;
}

void read()
{
	int i, j, x;

	scanf("%d", &N);

     N = 2 * N - 1;
     for(i = 0; i < N; i++)
     scanf("%d", A + i);

     memset(prev, -1, sizeof(prev));
     
     for(i = 0; i < N; i++)
     for(j = i - 1; j >= 0; j--)
     if(A[j] == A[i])
     {
     	prev[i] = j;
          j = 0;
     }
     for(j = 0; j < N; j+= 2)
     for(i = 0; i + j < N; i++)
     {
     	if(!j)
          {
          V[i][i + j] = 1;
          continue;
          }
          if(A[i] != A[i + j]) continue;
          for(x = i + j - 1; x > i; x = prev[x])
          V[i][i + j] += (V[i][x - 1] * V[x][i + j - 1]) % Q, V[i][i + j] %= Q;
     }
     printf("%d\n", V[0][N - 1]);
}