Pagini recente » Cod sursa (job #1844190) | Cod sursa (job #82458) | Cod sursa (job #2534874) | Profil 16_H | Cod sursa (job #1551733)
#include <cstdio>
#include <cstring>
using namespace std;
char s[2010];
short int D[2010][2010],st[12][2010],dr[12][2010],sol[2010];
int p1,p2,N,i;
short int maxx(short int x,short int y)
{
if(x<y)
return y;
return x;
}
void aw()
{
int i,j,L;
for(i=1; i<=N; ++i)
D[i][i]=1;
for(L=2; L<=N; ++L)
for(i=1; i<=N-L+1; ++i)
{
j=i+L-1;
D[i][j]=maxx(D[i+1][j],maxx(D[i][j-1],D[i+1][j-1]+2*(s[i]==s[j])));
}
for(i=1; i<=N; ++i)
{
for(j=0; j<=9; ++j)
st[j][i]=st[j][i-1];
st[s[i]-'0'][i]=i;
}
for(i=N; i>=1; --i)
{
for(j=0; j<=9; ++j)
dr[j][i]=dr[j][i+1];
dr[s[i]-'0'][i]=i;
}
}
void aww(short int left,short int right)
{
short int cif,Max=0;
if(p1>p2)
return;
if(p1==p2)
{
sol[p1]=s[left+1]-'0';
return;
}
for(cif=9; cif>=0; --cif)
Max=maxx(Max,D[dr[cif][left+1]][st[cif][right-1]]);
for(cif=9; cif>=0; --cif)
if(Max==D[dr[cif][left+1]][st[cif][right-1]])
{
if(!sol[1])
{
p1=1;
p2=Max;
N=Max;
}
sol[p1++]=cif;
sol[p2--]=cif;
aww(dr[cif][left+1],st[cif][right-1]);
break;
}
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(s+1);
N=strlen(s+1);
aw();
p1=1;
p2=N;
aww(0,N+1);
for(i=1;i<=N;++i)
printf("%hd",sol[i]);
return 0;
}