Pagini recente » Cod sursa (job #3272279) | Cod sursa (job #957583) | Cod sursa (job #2826117) | Cod sursa (job #843937) | Cod sursa (job #1508758)
#include <cstdio>
#define MAXN 2002
#define INF 10000
#define B 10
short p[MAXN+2][B], u[MAXN+2][B], d[MAXN+2][MAXN+2], v[MAXN+1], sol[MAXN];
int calc(int i, int j){
if((d[i][j]!=0)||(j==i-1)){
return d[i][j];
}
int x;
d[i][j]=1;
for(int k=B-1; k>=0; k--){
if((p[i][k]<u[j][k])&&(d[i][j]<(x=(calc(p[i][k]+1, u[j][k]-1)+2)))){
d[i][j]=x;
}
}
return d[i][j];
}
int main(){
int n, i, j, k, t, x;
char ch;
FILE *fin, *fout;
fin=fopen("elimin2.in", "r");
fout=fopen("elimin2.out", "w");
ch=fgetc(fin);
n=0;
while(ch!='\n'){
n++;
v[n]=ch-'0';
ch=fgetc(fin);
}
for(i=0; i<B; i++){
p[n+1][i]=n+1;
}
for(i=n; i>0; i--){
for(j=0; j<B; j++){
p[i][j]=p[i+1][j];
}
p[i][v[i]]=i;
}
for(i=0; i<B; i++){
u[0][i]=0;
}
for(i=1; i<=n; i++){
for(j=0; j<B; j++){
u[i][j]=u[i-1][j];
}
u[i][v[i]]=i;
}
for(i=1; i<=n; i++){
d[i][i]=1;
}
for(i=0; i<=n+1; i++){
for(j=0; j<i-1; j++){
d[i][j]=-INF;
}
}
for(i=1; i<n; i++){
if(v[i]==v[i+1]){
d[i][i+1]=2;
}else{
d[i][i+1]=1;
}
}
i=1;
j=n;
for(k=B-1; k>0; k--){
if((p[i][k]<u[j][k])&&(d[i][j]<(x=(calc(p[i][k]+1, u[j][k]-1)+2)))){
d[i][j]=x;
}
}
t=0;
i=1;
j=n;
while(i<=j){
if(d[i][j]==1){
k=B-1;
while(p[i][k]>u[j][k]){
k--;
}
}else{
k=B-1;
while((p[i][k]>u[j][k])||(d[p[i][k]+1][u[j][k]-1]+2<d[i][j])){
k--;
}
}
sol[t++]=k;
i=p[i][k]+1;
j=u[j][k]-1;
}
if(d[1][n]%2==0){
for(i=t-1; i>=0; i--){
sol[t++]=sol[i];
}
}else{
for(i=t-2; i>=0; i--){
sol[t++]=sol[i];
}
}
for(i=0; i<t; i++){
fputc(sol[i]+'0', fout);
}
fputc('\n', fout);
return 0;
}