Pagini recente » Cod sursa (job #438874) | Cod sursa (job #1112564) | Cod sursa (job #2833445) | Cod sursa (job #1179738) | Cod sursa (job #930112)
Cod sursa(job #930112)
#include<stdio.h>
#include<cstring>
using namespace std;
#define nmax 2005
long c, i, n, lg, ult[11], p1, p2, lgmax, poz, v[nmax], nc, inc, sf;
long ant[nmax][11], urm[nmax][11], pmin[nmax][nmax];
char s[nmax];
void init()
{
for (c=0;c<=9;c++)
ult[c]=-1;
for (i=0;i<n;i++)
{
for (c=0;c<=9;c++)
ant[i][c]=ult[c];
ult[s[i]-'0']=i;
}
for (c=0;c<=9;c++)
ult[c]=-1;
for (i=n-1;i>=0;i--)
{
for (c=0;c<=9;c++)
urm[i][c]=ult[c];
ult[s[i]-'0']=i;
}
lgmax=1;
for (i=0;i<n;i++)
{
pmin[i][1]=i;
pmin[i][2]=urm[i][s[i]-'0'];
if (pmin[i][2]>-1)
lgmax=2;
}
}
void calculare()
{
for (lg=3;lg<=n;lg++)
for (i=0;i<n;i++)
pmin[i][lg]=-1;
for (lg=3;lg<=n;lg++)
{
for (i=0;i+lg-1<n;i++)
{
for (c=0;c<=9;c++)
{
p1=urm[i][c];
if (p1>-1)
p2=pmin[p1][lg-2];
if ((p1>-1)&&(p2>-1))
if (urm[p2][s[i]-'0']>-1)
if ((pmin[i][lg]==-1)||(pmin[i][lg]>urm[p2][s[i]-'0']))
pmin[i][lg]=urm[p2][s[i]-'0'];
}
if ((pmin[i][lg]>-1)&&(lg>lgmax)&&(s[i]!='0'))
lgmax=lg;
}
}
}
void afisare()
{
// urm[0][s[0]-'0']=0;
for (c=9;c>=1;c--)
{
p1=urm[0][c];
if (c==s[0]-'0')
p1=0;
if (p1>-1)
if (pmin[p1][lgmax]>-1)
{
printf("%ld",c); poz=p1;
v[++nc]=c;
break;
}
}
inc=poz; sf=pmin[poz][lgmax];
lg=lgmax-2;
while (lg>0)
{
for (c=9;c>=0;c--)
{
p1=urm[inc][c];
if (p1>-1)
if ((pmin[p1][lg]>-1)&&(pmin[p1][lg]<sf))
{
printf("%ld",c); inc=p1; sf=pmin[p1][lg];
v[++nc]=c;
break;
}
}
lg-=2;
}
if (lgmax%2==0)
printf("%ld",v[nc]);
nc--;
while (nc>0)
{ printf("%ld",v[nc]); nc--; }
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(s); n=strlen(s);
init();
calculare();
afisare();
//printf("\n%ld",lgmax);
return 0;
}