Pagini recente » Cod sursa (job #17409) | Cod sursa (job #981962) | Cod sursa (job #1829502) | Cod sursa (job #2868418) | Cod sursa (job #1476196)
#include <iostream>
#include <string.h>
#include <stdio.h>
#define NMax 2050
using namespace std;
short L[NMax][NMax],St[NMax][10],Dr[NMax][10];
int N,sol,X;
char S[NMax];
void Write(int st,int dr,int X)
{
if(X<=0)
return;
for(int i=9;i>=0;i--)
if(L[Dr[st][i]][St[dr][i]]==X)
{
printf("%d",i);
Write(Dr[st][i]+1,St[dr][i]-1,X-2);
if(X>1)
printf("%d",i);
return;
}
}
inline int max(const int &x, const int &y)
{
return (x<y?y:x);
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
fgets(S+1,NMax,stdin);
N=strlen(S+1)-1;
for(int i=1;i<=N;i++)
{
for(int j=0;j<10;j++)
St[i][j]=St[i-1][j];
St[i][S[i]-'0']=i;
}
for(int i=N;i>=1;i--)
{
for(int j=0;j<10;j++)
Dr[i][j]=Dr[i+1][j];
Dr[i][S[i]-'0']=i;
}
for(int i=1;i<=N;i++)
L[i][i]=1;
for(int lenght=2;lenght<=N;lenght++)
for(int i=1;i+lenght-1<=N;i++)
{
int j=i+lenght-1;
L[i][j]=max(L[i+1][j],L[i][j-1]);
if(S[i]==S[j])
L[i][j]=max(L[i][j],L[i+1][j-1]+2);
}
for(int i=1;i<=9;i++)
sol=max(sol,L[Dr[1][i]][St[N][i]]);
Write(1,N,sol);
}