Pagini recente » Cod sursa (job #1850422) | Cod sursa (job #2986061) | Cod sursa (job #1589092) | Cod sursa (job #3129345) | Cod sursa (job #48430)
Cod sursa(job #48430)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nmax 2048
#define max(a,b) (a>b?a:b)
int n,i,j,left[10][nmax],right[10][nmax];
short l[nmax][nmax],c,sn;
char s[nmax],sol[nmax];
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(s);
n=strlen(s);
for (i=0;i<10;i++)
left[i][n+1]=n+1;
for (i=n;i>0;i--)
for (j=0;j<10;j++)
if (s[i-1]==j+'0')
left[j][i]=i;
else
left[j][i]=left[j][i+1];
for (i=1;i<=n;i++)
for (j=0;j<10;j++)
if (s[i-1]==j+'0')
right[j][i]=i;
else
right[j][i]=right[j][i-1];
for (i=1;i<=n;i++)
l[i][i]=1;
for (j=1;j<=n-1;j++)
for (i=1;i<=n-j;i++)
{
l[i][i+j]=max(l[i+1][i+j],l[i][i+j-1]);
if (right[s[i-1]-'0'][i+j]>i)
l[i][i+j]=max(l[i][i+j],l[i+1][right[s[i-1]-'0'][i+j]-1]+2);
if ((left[s[i+j-1]-'0'][i]<j)&&(left[s[i+j-1]-'0'][i]))
l[i][i+j]=max(l[i][i+j],l[left[s[i+j-1]-'0'][i]+1][i+j-1]+2);
}
i=1,j=n;
while (l[i][j]>2)
{
c=9;
while (l[left[c][i]+1][right[c][j]-1]!=l[i][j]-2)
--c;
i=left[c][i]+1,j=right[c][j]-1;
if ((sn==0)&&(c==0))
continue;
sol[sn]=c+'0',++sn;
}
printf("%s",sol);
if (l[i][j]==1)
{
c=9;
while ((left[c][i]==0)||(left[c][i]>j))
--c;
printf("%c",c+'0');
}
else
{
c=9;
while ((left[c][i]==0)||(right[c][j]==0)||(left[c][i]>right[c][j]))
--c;
printf("%c%c",c+'0',c+'0');
}
for (i=strlen(sol)-1;i>=0;i--)
printf("%c",sol[i]);
return 0;
}