Cod sursa(job #654871)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 31 decembrie 2011 01:56:46
Problema Culori Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define FISIN   "culori.in"
#define FISOUT  "culori.out"
#define MAXN    256
#define MOD     9901

int n, m;
int mat[2 * MAXN][2 * MAXN];
int input[2 * MAXN];

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  fscanf(fin, "%d", &n);
  m = 2 * n - 1;
  for (int i = 0; i < m; ++i) {
    fscanf(fin, "%d", input + i);
    mat[i][i] = 1;
  }

  for (int k = 2; k < m; k += 2) {
    for (int i = 0; i + k < m; ++i) {
      int j = i + k;
      mat[i][j] = 0;
      if (input[i] != input[j]) continue;
      
      mat[i][j] = mat[i + 1][j - 1];

      for (int l = i + 2; l < j; l += 2) {
	/*
	printf("Using [%d %d](%d) and [%d %d](%d)\n",
	       i + 1, l - 1, mat[i + 1][l - 1],
	       l + 1, j - 1, mat[l + 1][j - 1]);
	*/
	       
	mat[i][j] += mat[i + 1][l - 1] * mat[l + 1][j - 1];
	mat[i][j] %= MOD;
      }

      //      printf("%d %d -> %d\n", i, j, mat[i][j]);
    }
  }

  fprintf(fout, "%d\n", mat[0][m - 1]);

  fclose(fout);
  fclose(fin);
  return 0;
}