Pagini recente » Cod sursa (job #1549744) | Cod sursa (job #1296215) | Cod sursa (job #3030145) | Cod sursa (job #3176789) | Cod sursa (job #2025367)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream si("elimin2.in");
ofstream so("elimin2.out");
char s[2005],sol[2005];
short d[2005][2005],nxt[2005][10],pr[2005][10];
int fir,last;
inline void solve(int st,int dr,int lg)
{
if(st>dr)
return;
if(lg<0)
return;
for(int i=9;i>=0;i--)
{
if(d[nxt[st][i]][pr[dr][i]]==lg)
{
sol[fir++]=(char)(i+'0');
sol[last--]=(char)(i+'0');
solve(nxt[st][i]+1,pr[dr][i]-1,lg-2);
return;
}
}
return;
}
int main()
{
si>>s+1;
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
for(int j=0;j<=9;j++)
{
pr[i][j]=pr[i-1][j];
}
pr[i][s[i]-'0']=i;
}
for(int i=0;i<=9;i++)
nxt[n+1][i]=n+1;
for(int i=n;i>=1;i--)
{
for(int j=0;j<=9;j++)
{
nxt[i][j]=nxt[i+1][j];
}
nxt[i][s[i]-'0']=i;
}
for(int i=1;i<=n;i++)
d[i][i]=1;
for(int lg=2;lg<=n;lg++)
{
for(int i=1;i<=n-lg+1;i++)
{
if(s[i]==s[i+lg-1])
{
d[i][i+lg-1]=max(d[i][i+lg-1],(short)(2+d[i+1][i+lg-2]));
}
else
{
d[i][i+lg-1]=max(d[i][i+lg-1],max(d[i+1][i+lg-1],d[i][i+lg-2]));
}
}
}
short l=0;
for(int i=1;i<=9;i++)
{
l=max(l,d[nxt[1][i]][pr[n][i]]);
}
fir=0;
last=l-1;
solve(1,n,l);
so<<sol;
return 0;
}