Pagini recente » Cod sursa (job #1460197) | Cod sursa (job #555887) | Cod sursa (job #1117239) | Cod sursa (job #2350460) | Cod sursa (job #930495)
Cod sursa(job #930495)
#include <stdio.h>
#include <string.h>
#define NMax 2010
const char IN[]="elimin2.in",OUT[]="elimin2.out";
int N;
short T[NMax][NMax];char D[NMax][NMax];
char s[NMax];
bool first;
void write(int x,int y){
if (x>y) return;
if (x==y){
printf("%c",s[x]);
return;
}
int nx=x,ny=y;
if (s[x]==s[y] && T[x][y]==T[x+1][y-1]+2) ++nx,--ny;
else if (D[x][y]==D[x+1][y] && T[x][y]==T[x+1][y]) ++nx;
else --ny;
bool b=first;
if (T[x][y]>T[nx][ny] && (b || s[x]!='0'))
printf("%c",s[x]),first=true;
write(nx,ny);
if (T[x][y]>T[nx][ny] && (b || s[x]!='0'))
printf("%c",s[x]);
}
int main()
{
int i,j,k;
freopen(IN,"r",stdin);
scanf("%s",s+1);
fclose(stdin);
N=strlen(s+1);
for (i=1;i<=N;++i) T[i][i]=1,D[i][i]=s[i]-'0';
for (k=2;k<=N;++k)
for (i=1;i+k-1<=N;++i){
j=i+k-1;
if (s[i]==s[j]) T[i][j]=T[i+1][j-1]+2,D[i][j]=s[i]-'0';
if (T[i+1][j]>T[i][j] || T[i+1][j]==T[i][j] && D[i+1][j]>D[i][j])
T[i][j]=T[i+1][j],D[i][j]=D[i+1][j];
if (T[i][j-1]>T[i][j] || T[i][j-1]==T[i][j] && D[i][j-1]>D[i][j])
T[i][j]=T[i][j-1],D[i][j]=D[i][j-1];
}
freopen(OUT,"w",stdout);
write(1,N);printf("\n");
fclose(stdout);
return 0;
}