Cod sursa(job #844891)

Utilizator stoicatheoFlirk Navok stoicatheo Data 29 decembrie 2012 22:03:05
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <string.h>
 
#define MAXN 2050
#define SIGMA 10
 
short D[MAXN][MAXN];
char S[MAXN];
short St[MAXN][SIGMA];
short Dr[MAXN][SIGMA];
 
int i, j, lung;
int N, Ans;
 
inline int max(const int &a, const int &b)
{
    return (a<b ? b : a);
}
 
void afis(int st, int dr, short val)
{
    if (val <= 0) return;
     
    for (int i = SIGMA - 1; i >= 0; --i)
        if (D[ Dr[st][i] ][ St[dr][i] ] == val){
            printf("%d",i);
             
            afis(Dr[st][i]+1, St[dr][i] - 1, val-2);
             
            if (val > 1) 
                printf("%d", i);
             
            return;
        }
}
 
int main()
{
    freopen("elimin2.in","r",stdin);
    freopen("elimin2.out","w",stdout);
     
    fgets(S+1, MAXN, stdin);
    N = strlen(S+1) - 1;
     
    for (i = 1; i <= N; ++i){
        for (j = 0; j < SIGMA; ++j)
            St[i][j] = St[i-1][j];
        St[i][S[i]-'0'] = i;
    }
     
    for (i = N; i >= 1; --i){
        for (j = 0; j < SIGMA; ++j)
            Dr[i][j] = Dr[i+1][j];
        Dr[i][S[i]-'0'] = i;
    }
     
    for (i = 1; i <= N; ++i)
        D[i][i] = 1;
     
    for (lung = 2; lung <= N; ++lung)
        for (i = 1; i + lung - 1  <= N; ++i){
            j = i + lung - 1;
            D[i][j] = max(D[i+1][j], D[i][j-1]);
            if (S[i] == S[j])
                D[i][j] = max(D[i][j], D[i+1][j-1] + 2);
        }
     
    Ans = 0;
    for (i = 1; i < SIGMA; ++i)
        Ans = max(Ans, D[ Dr[1][i] ][ St[N][i] ]);
     
    afis(1, N, Ans);
     
    return 0;
}