Pagini recente » Cod sursa (job #396134) | Cod sursa (job #2874738) | Cod sursa (job #77467) | Cod sursa (job #1822542) | Cod sursa (job #2130236)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <deque>
#define INF 2140000000
#define MOD 1000000007
#define MaxN 2005
using namespace std;
FILE*IN=fopen("elimin2.in","r"),*OUT=fopen("elimin2.out","w");
char str[MaxN];
short d[MaxN][MaxN],Next[MaxN][10],Last[MaxN][10];
int N,s,e,Max=1;
void Solve(int s,int e,int l)
{
if(l<=0||(s>e))return;
for(int i=9;i>=0;i--)
{
if(d[Next[s][i]][Last[e][i]]==l)
{
fprintf(OUT,"%c",i+'0');
Solve(Next[s][i]+1,Last[e][i]-1,l-2);
if(l>1)fprintf(OUT,"%c",i+'0');
return;
}
}
}
int main()
{
fscanf(IN,"%s",str+1);
N=strlen(str+1);
for(int i=1;i<=N;i++)
d[i][i]=1;
for(int l=1;l<N;l++)
for(int r=1;r<=N-l;r++)
{
int i=r,j=r+l;
d[i][j]=max(d[i][j-1],d[i+1][j]);
if(str[i]==str[j]&&2+d[i+1][j-1]>d[i][j])
d[i][j]=d[i+1][j-1]+2;
}
for(int i=9;i>=0;i--)
Next[N+1][i]=N+1;
for(int i=1;i<=N;i++)
{
memcpy(Next[N+1-i],Next[N+2-i],sizeof Next[N+1-i]);
memcpy(Last[i],Last[i-1],sizeof Last[i]);
Next[N+1-i][str[N+1-i]-'0']=N+1-i;
Last[i][str[i]-'0']=i;
}
for(int i=9;i>=1;i--)
if(d[Next[1][i]][Last[N][i]]>Max)
Max=d[Next[1][i]][Last[N][i]];
Solve(1,N,Max);
return 0;
}