Cod sursa(job #18609)

Utilizator scapryConstantin Berzan scapry Data 18 februarie 2007 12:46:54
Problema Culori Scor 24
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 0.8 kb
#include <stdio.h>

enum { maxn = 257, modulo = 9901 };

int n, p[2 * maxn];
int dp[2 * maxn][maxn];
//dp[pos][depth]

int main()
{
	int i, j;
	bool bad = false;
	FILE *f = fopen("culori.in", "r");
	if(!f) return 1;
	
	fscanf(f, "%d", &n);
	for(i = 0; i < 2 * n - 1; i++)
	{
		fscanf(f, "%d", &p[i]);
		
		if(p[i] < 1 || p[i] > n) bad = true;
	}
	
	fclose(f);
	f = fopen("culori.out", "w");
	if(!f) return 1;
	
	if(p[0] != p[2 * n - 2] || bad)
		fprintf(f, "0\n");
	else
	{
		dp[2 * n - 2][0] = 1;
		
		for(i = 2 * n - 3; i >= 0; i--) //position
			for(j = 0; j < n; j++) //depth
			{
				if(i - 1 >= 0)
					if(p[i - 1] == p[i + 1]) //may go back
						dp[i][j] += dp[i + 1][j - 1];
				
				dp[i][j] += dp[i + 1][j + 1];
				dp[i][j] %= modulo;
			}
		
		fprintf(f, "%d\n", dp[0][0]);
	}
	
	fclose(f);
	return 0;
}