Pagini recente » Cod sursa (job #2818446) | Cod sursa (job #305461) | Cod sursa (job #1318431) | Cod sursa (job #2047627) | Cod sursa (job #294430)
Cod sursa(job #294430)
#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]);
}