Cod sursa(job #294490)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 2 aprilie 2009 16:13:38
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cstring>
#define lm 2002

char v[lm], s[lm];
short a[lm][lm], n, m;

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

void sol(short l, short r, short k, short t)
{
    short i, c, p, q;
	for (c=9; c>=0; 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 (a[p][q-p+1]==t)
			{
			    s[k]=c;
   	            s[m-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);
	short i,j;
	n=strlen(v);
	for (i=n; i>0; i--) v[i]=v[i-1]-'0';
	for (i=1; i<=n; i++) a[i][1]=1;
	for (i=2; i<=n; i++)
	    for (j=1; j+i-1<=n; j++)
		{
			a[j][i]=max(a[j][i-1],a[j+1][i-1]);
			if (v[j]==v[j+i-1]) a[j][i]=max(a[j][i],a[j+1][i-2]+2);
        }
    int p, q;
	for (i=9; i>0; i--)
	{
	    p=0;
		for (p=1; p<=n; p++)
		    if (v[p]==i) break;
        q=0;
		if (p)
		    for (q=n; q>=p; q--)
			    if (v[q]==i) break;
		if (p && q)
		    if (a[p][q-p+1]>m)
			{
			    m=a[p][q-p+1];
				s[1]=i;
            }
    }
	s[m]=s[1];
	sol(1,n,1,m);
	for (i=1; i<=m; i++) printf("%d",s[i]);
}