Cod sursa(job #294430)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 2 aprilie 2009 15:40:21
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <cstring>
#define lm 2010

char v[lm], s[lm];
short a[lm][lm], b[lm][lm];

short max(short a, short b)
{
	if (a<b) a=b;
	return a;
}

void sol(int l, int r, int k, int t)
{
    int i, x, c, p, q;
	if (k==1) x=1; else x=0;
	for (c=9; c>=x; c--)
	{
	    p=0;
        for (p=l; p<=r; p++)
		    if (v[p]==c) break;
        q=0;
		if (p)
		    for (i=r; i>=p; i--)
			    if (v[i]==c)
				{
				    q=i;
					break;
                }
		if (q && p)
		{
		    if (k==1)
			{
			    if (a[p][q-p+1]==t)
				{
					s[k]=c;
    		        s[a[1][v[0]]-k+1]=c;
                    if (p+1<=q-1 && t>2) sol(p+1,q-1,k+1,t-2);
    				break;
                }
            } else
			if (k>1)
			{
			    if (b[p][q-p+1]==t)
				{
					s[k]=c;
        		    s[a[1][v[0]]-k+1]=c;
				    if (p+1<=q-1 && t>2) sol(p+1,q-1,k+1,t-2);
	    			break;
                }
            }
        }
    }
}

int main()
{
    freopen("elimin2.in","r",stdin);
	freopen("elimin2.out","w",stdout);
	scanf("%s",v);
	int i,j;
	j=strlen(v);
	for (i=j; i>0; i--) v[i]=v[i-1]-'0';
	v[0]=j;
	for (i=1; i<=v[0]; i++)
	{
	    b[i][1]=1;
	    if (v[i]) a[i][1]=1;
    }
	for (i=2; i<=v[0]; i++)
	    for (j=1; j+i-1<=v[0]; j++)
		{
			a[j][i]=max(a[j][i-1],a[j+1][i-1]);
			b[j][i]=max(b[j][i-1],b[j+1][i-1]);
			if (v[j]==v[j+i-1])
			{
				b[j][i]=max(b[j][i],b[j+1][i-2]+2);
				if (v[j]) a[j][i]=max(a[j][i],b[j+1][i-2]+2);
			}
        }
	sol(1,v[0],1,a[1][v[0]]);
	for (i=1; i<=a[1][v[0]]; i++) printf("%d",s[i]);
}