Cod sursa(job #1508758)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 22 octombrie 2015 22:14:14
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#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;
}