Cod sursa(job #38237)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 25 martie 2007 16:25:26
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#include <string.h>

#define MAXN 2005

int N, x[MAXN];

short nr[MAXN][MAXN];
short first[MAXN][10], last[MAXN][10];

char sol[MAXN];

int main()
{
	freopen("elimin2.in", "rt", stdin);
	freopen("elimin2.out", "wt", stdout);

	for (char c; scanf(" %c ", &c) != EOF; )
		x[++N] = c - '0';

	for (int k = 0; k < 10; k++)
		first[N + 1][k] = N + 1;
	for (int i = N; i; i--)
	{
		for (int k = 0; k < 10; k++)
			first[i][k] = first[i + 1][k];
		first[i][ x[i] ]  = i;
	}

	for (int k = 0; k < 10; k++)
		last[0][k] = 0;
	for (int i = 1; i <= N; i++)
	{
		for (int k = 0; k < 10; k++)
			last[i][k] = last[i - 1][k];
		last[i][ x[i] ] = i;
	}

	memset( nr, 0x3f, sizeof(nr) );
	for (int i = 1; i <= N; i++)
		nr[i][i] = 1, nr[i][i - 1] = 0;


	for (int i = N; i > 0; i--)
		for (int j = i + 1; j <= N; j++)
		{
			nr[i][j] = nr[i][j - 1];
			if (nr[i + 1][j] > nr[i][j])
				nr[i][j] = nr[i + 1][j];

			if (x[i] == x[j] && nr[i + 1][j - 1] + 2 > nr[i][j])
				nr[i][j] = nr[i + 1][j - 1] + 2;
		}

	int NR = nr[1][N], l = 1, r = N, sl = 0, sr = NR - 1;
	for (; NR; )
	{
		for (int k = 9; k >= 0; k--)
		{
			if (l == 1 && k == 0 && NR > 1)
			{
				NR -= 2; sr -= 2;
				break;
			}

			int pL, pR;
			pL = first[l][k];
			pR = last[r][k];

			if (pL == N + 1 || pR == 0) continue;
			if (pL > pR) continue;

			if ( ( pL == pR && NR != 1 ) || ( pL != pR && nr[ pL + 1 ][ pR - 1 ] != NR - 2 ) )
				continue;

			sol[sl++] = k + '0';
			sol[sr--] = k + '0';
			NR -= 1 + (pL != pR);
			l = pL + 1;
			r = pR - 1;
			break;
		}
	}
	printf("%s\n", sol);

	return 0;
}