Pagini recente » Cod sursa (job #1206403) | stefan | Cod sursa (job #2742783) | Monitorul de evaluare | Cod sursa (job #2007260)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMax 2010
using namespace std;
const char IN[]="elimin2.in",OUT[]="elimin2.out";
int N;
short T[NMax][NMax],first[NMax][10],last[NMax][10];
char s[NMax];
void write(int x,int y)
{
if (x>y || !x) return;
if (x==y)
{
printf("%c",s[x]);
return;
}
if (s[x]==s[y]) printf("%c",s[x]);
for (int c=9;c>=0;--c)if (T[first[x+1][c]][last[y-1][c]]+2==T[x][y])
{
write(first[x+1][c],last[y-1][c]);
break;
}
if (s[x]==s[y]) printf("%c",s[x]);
}
int main()
{
int i,j,k,x,y;
freopen(IN,"r",stdin);
scanf("%s",s+1);
fclose(stdin);
N=strlen(s+1);
for (i=1;i<=N;++i)
{
for (j=0;j<10;++j) last[i][j]=last[i-1][j];
last[i][s[i]-'0']=i;
}
for (i=N;i>0;--i)
{
for (j=0;j<10;++j) first[i][j]=first[i+1][j];
first[i][s[i]-'0']=i;
}
for (i=1;i<=N;++i) T[i][i]=1;
for (i=x=1;i<=N;++i) if (s[i]>s[x]) x=i;y=x;
for (k=2;k<=N;++k)
for (i=1;i+k-1<=N;++i)
{
j=i+k-1;
if (s[i]==s[j]) T[i][j]=T[i+1][j-1]+2;
else T[i][j]=max(T[i+1][j],T[i][j-1]);
}
for (i=10;i>0;--i) if (T[first[1][i]][last[N][i]]>T[x][y]) x=first[1][i],y=last[N][i];
freopen(OUT,"w",stdout);
write(x,y);printf("\n");
fclose(stdout);
return 0;
}