Pagini recente » Cod sursa (job #2237755) | Cod sursa (job #490971) | Cod sursa (job #2454767) | Cod sursa (job #1103204) | Cod sursa (job #362387)
Cod sursa(job #362387)
#include <stdio.h>
#define Nmax 2003
#define I short int
#define Cmax 10
I N[Nmax],nr[Nmax];
I l[Nmax][Nmax];
I left[Cmax][Nmax],right[Cmax][Nmax];
I i,j,n,xx,yy,c,st,dr,cif,lmax,lg,y;
char cc;
I max(I x,I y){ return x>y ? x : y; }
void prep_left_right(){
I i,c;
for(c=0;c<10;++c)
for(i=1;i<=n;++i)
left[c][i]=10000;
for(c=0;c<10;++c){
for(i=1;i<=n;++i)
if(N[i] == c) right[c][i] = i;
else right[c][i] = right[c][i-1];
for(i=n;i>=1;--i)
if(N[i] == c) left[c][i] = i;
else left[c][i] = left[c][i+1];
}
}
void solve(){
I i,j,lg,y;
for(i=1;i<=n;++i) l[i][i]=1;
for(lg=2; lg<=n; ++lg)
for(i=1; (j=i+lg-1)<=n; ++i){
// j=i+lg-1;
// y=0;
l[i][j] = max( l[i+1][j], l[i][j-1] );
if(right[N[i]][j] >= i+1 )
l[i][j] = max( l[i][j], l[i+1][right[N[i]][j]-1]+2);
if(left[N[j]][i] <= j-1 /*&& left[N[j]][i] != 0*/)
l[i][j] = max(l[i][j], l[left[N[j]][i]+1][j-1]+2);
// l[i][j] = max(l[i][j],y);
}
}
void reconst(I i,I j,I x){
I c;
if( x <=0 ) return;
for(c=9; c>=0; --c)
if( l[left[c][i]][right[c][j]] == x ){
nr[++xx]=c, nr[--yy]=c;
reconst(left[c][i]+1,right[c][j]-1,x-2);
break;
}
}
int main(){
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
for(scanf("%c",&cc); cc!='n' && !feof(stdin); scanf("%c",&cc))
N[++n]=cc-'0';
prep_left_right();
solve();
for(c=9; c>=1; --c)
if( l[left[c][1]][right[c][n]] > lmax ){
lmax=l[left[c][1]][right[c][n]];
cif=c;
}
nr[xx=1]=cif; nr[yy=lmax]=cif;
reconst(left[cif][1]+1,right[cif][n]-1,lmax-2);
for(i=1;i<=lmax;++i) printf("%d",nr[i]);
printf("\n");
fclose(stdin); fclose(stdout);
return 0;
}