Pagini recente » Cod sursa (job #1044174) | Cod sursa (job #910951) | Cod sursa (job #1942583) | Cod sursa (job #714014) | Cod sursa (job #294421)
Cod sursa(job #294421)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lm 2010
using namespace std;
char c[lm];
int a[lm][lm], b[lm][lm], v[lm], s[lm];
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",c);
v[0]=strlen(c);
int i,j;
for (i=1; i<=v[0]; i++) v[i]=c[i-1]-'0';
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]);
}