Cod sursa(job #491959)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 12 octombrie 2010 22:47:29
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <string.h>

int n;
char v[2005];
short int d[2003][2003], st[2003][10], dr[2003][10];

inline int max (int a, int b) {return a > b ? a : b;}

void print (int p, int u, int sol)
{
	if (sol < 1)
		return;
	
	int i;
	for (i = 9; i >= 0; i --)
		if (d[dr[p][i]][st[u][i]] == sol)
			break;
	printf ("%d", i);
	print (dr[p][i] + 1, st[u][i] - 1, sol - 2);
	if (sol > 1)
		printf ("%d", i);
}

int main ()
{
	freopen ("elimin2.in", "r", stdin);
	freopen ("elimin2.out", "w", stdout);
	
	gets (v + 1);
	n = strlen (v + 1);
	
	int i, j, l, sol = 0;
	
	for (i = 1; i <= n; i ++)
		for (j = 0; j <= 9; j ++)
		{
			st[i][j] = st[i - 1][j];
			if (v[i] == j + '0')
				st[i][j] = i;
		}
	for (j = 0; j <= 9; j ++)
		dr[n + 1][j] = n + 1;
	for (i = n; i >= 1; i --)
		for (j = 0; j <= 9; j ++)
		{
			dr[i][j] = dr[i + 1][j];
			if (v[i] == j + '0')
				dr[i][j] = i;
		}
	
	for (i = 1; i <= n; i ++)
		d[i][i] = 1;
	for (l = 2; l <= n; l ++)
		for (i = 1; i <= n - l + 1; i ++)
		{
			j = i + l - 1;
			d[i][j] = max (d[i + 1][j], d[i][j - 1]);
			if (v[i] == v[j])
				d[i][j] = max (d[i][j], d[i + 1][j - 1] + 2);
		}
	
	for (i = 1; i <= 9; i ++)
		sol = max (sol, d[dr[1][i]][st[n][i]]);
	print (1, n, sol);
	
	return 0;
}