Cod sursa(job #42083)

Utilizator ionescu_bogdanIonescu Bogdan-Gabriel ionescu_bogdan Data 28 martie 2007 20:35:35
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define nmax 2048
#define max(a,b) (a>b?a:b)

int n,i,j,left[10][nmax],right[10][nmax];
short l[nmax][nmax],c,sn;
char s[nmax],sol[nmax];

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

	gets(s);
	n=strlen(s);
	for (i=n;i>0;i--)
		for (j=0;j<10;j++)
			if (s[i-1]==j+'0')
				left[j][i]=i;
			else
				left[j][i]=left[j][i+1];
	for (i=1;i<=n;i++)
		for (j=0;j<10;j++)
			if (s[i-1]==j+'0')
				right[j][i]=i;
			else
				right[j][i]=right[j][i-1];
	for (i=1;i<=n;i++)
		l[i][i]=1;

	for (j=1;j<=n-1;j++)
		for (i=1;i<=n-j;i++)
		{
			l[i][i+j]=max(l[i+1][i+j],l[i][i+j-1]);
			if (right[s[i-1]-'0'][i+j]>i)
				l[i][i+j]=max(l[i][i+j],l[i+1][right[s[i-1]-'0'][i+j]-1]+2);
			if ((left[s[i+j-1]-'0'][i]<j)&&(left[s[i+j-1]-'0'][i]))
				l[i][i+j]=max(l[i][i+j],l[left[s[i+j-1]-'0'][i]+1][i+j-1]+2);
		}
	i=1,j=n;
	while (l[i][j]>2)
	{
		c=9;
		while (l[left[c][i]+1][right[c][j]-1]!=l[i][j]-2)
			--c;
		i=left[c][i]+1,j=right[c][j]-1;
		if ((sn==0)&&(c==0))
			continue;
		sol[sn]=c+'0',++sn;
	}
	printf("%s",sol);
	if (l[i][j]==1)
	{
		c=9;
		while ((left[c][i]==0)||(left[c][i]>j))
			--c;
		printf("%c",c+'0');
	}
	else
	{
		c=9;
		while ((left[c][i]==0)||(right[c][j]==0)||(left[c][i]>right[c][j]))
			--c;
		printf("%c%c",c+'0',c+'0');
	}
	for (i=strlen(sol)-1;i>=0;i--)
		printf("%c",sol[i]);

	return 0;
}