Cod sursa(job #44766)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 31 martie 2007 18:31:15
Problema Elimin 2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>
#include <string>

#define maxn 2010
#define maxl 4
#define maxv 10000

char a[maxn];
int p[maxn];
int n;
short c[maxl][maxn],d[maxl][maxn];
short from[maxn][maxn];
char sol[maxn];

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

	int i,j,x,y,k,aux;
	fgets(a,maxn,stdin);
	n=strlen(a)-2;

	p[0]=0;
	
	for (i=1;i<=n+1;i++)
	{
		p[i]=p[i-1]+1;
		if (p[i]==maxl) p[i]=0;
	}

	for (i=0;i<maxl;i++)
	  for (j=0;j<=n;j++) c[i][j]=maxv;

	for (i=0;i<=n;i++)
	  for (j=0;j<=n;j++) from[i][j]=maxv;

	for (i=0;i<=n;i++)
    {
		c[1][i]=0;
		d[1][i]=a[i]-'0';
	}

	for (i=0;i<n;i++)
	  if (a[i]==a[i+1])
	  {
		   c[2][i]=0;
		   d[2][i]=a[i]-'0';
      }
	  else c[2][i]=2;

	for (i=1;i<=n+1;i++)
	{
	  for (x=0;x<=n;x++)
	  {
		  if (i+2<=n+1) c[p[i+2]][x]=maxv;
		  if (i+3<=n+1) c[p[i+3]][x]=maxv;
	  }

	  for (x=0;x+i-1<=n;x++)
      {
		  y=i+x-1;
          if ((x>0) && (y<n) && (a[x-1]==a[y+1]) && ((c[p[i]][x]<c[p[i+2]][x-1]) || ((c[p[i]][x]==c[p[i+2]][x-1]) && (a[x-1]-'0'>d[p[i+2]][x-1]))))
          {
                    c[p[i+2]][x-1]=c[p[i]][x];
                    d[p[i+2]][x-1]=a[x-1]-'0';
                    from[i+2][x-1]=i;
          }   
          if ((x>0) && ((c[p[i]][x]+1<c[p[i+1]][x-1]) || ((c[p[i]][x]+1==c[p[i+1]][x-1]) && (d[p[i]][x]>d[p[i+1]][x-1]))))
          {
                    c[p[i+1]][x-1]=c[p[i]][x]+1;
                    d[p[i+1]][x-1]=d[p[i]][x];
                    from[i+1][x-1]=-i;
          }
          if ((y<n) && ((c[p[i]][x]+1<c[p[i+1]][x]) || ((c[p[i]][x]+1==c[p[i+1]][x]) && (d[p[i]][x]>d[p[i+1]][x]))))
          {
                    c[p[i+1]][x]=c[p[i]][x]+1;
                    d[p[i+1]][x]=d[p[i]][x];
                    from[i+1][x]=i;
          }
      }
    }
    
	i=n+1;
    j=0;
	k=n-c[p[n+1]][0];
	x=0;
	y=n;

	while (i!=maxv)
	{
		aux=from[i][x];
		if (aux>=0)
		  if ((i-aux==2) || (aux==maxv))
		  {
			  sol[j++]=a[x++];
			  sol[k--]=a[y--];
		  }
		  else y--;
		else x++;
		if (aux>=0) i=aux;
		else i=-aux;
	}

    j=0;
    while (sol[j]=='0') j++;
    
	for (i=j;i<=n-c[p[n+1]][0]-j;i++) printf("%c",sol[i]);
	printf("\n");
          
	return 0;
}