Cod sursa(job #940439)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 11:24:40
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <stdio.h>
#include <string.h>
 
#define MAXN 2005
 
int N, x[MAXN];
 
short nr[MAXN][MAXN];
short first[MAXN][10], last[MAXN][10];
 
char sol[MAXN];
 
int main()
{
    freopen("elimin2.in", "rt", stdin);
    freopen("elimin2.out", "wt", stdout);
 
    for (char c; scanf(" %c ", &c) != EOF; )
        x[++N] = c - '0';
 
    for (int k = 0; k < 10; k++)
        first[N + 1][k] = N + 1;
    for (int i = N; i; i--)
    {
        for (int k = 0; k < 10; k++)
            first[i][k] = first[i + 1][k];
        first[i][ x[i] ]  = i;
    }
 
    for (int k = 0; k < 10; k++)
        last[0][k] = 0;
    for (int i = 1; i <= N; i++)
    {
        for (int k = 0; k < 10; k++)
            last[i][k] = last[i - 1][k];
        last[i][ x[i] ] = i;
    }
 
    memset( nr, 0x3f, sizeof(nr) );
    for (int i = 1; i <= N; i++)
        nr[i][i] = 1, nr[i][i - 1] = 0;
 
 
    for (int i = N; i > 0; i--)
        for (int j = i + 1; j <= N; j++)
        {
            nr[i][j] = nr[i][j - 1];
            if (nr[i + 1][j] > nr[i][j])
                nr[i][j] = nr[i + 1][j];
 
            if (x[i] == x[j] && nr[i + 1][j - 1] + 2 > nr[i][j])
                nr[i][j] = nr[i + 1][j - 1] + 2;
        }
 
    int NR = nr[1][N], l = 1, r = N, sl = 0, sr = NR - 1;
    for (; NR; )
    {
        for (int k = 9; k >= 0; k--)
        {
            if (l == 1 && k == 0 && NR > 1)
            {
                NR -= 2; sr -= 2;
                break;
            }
 
            int pL, pR;
            pL = first[l][k];
            pR = last[r][k];
 
            if (pL == N + 1 || pR == 0) continue;
            if (pL > pR) continue;
 
            if ( ( pL == pR && NR != 1 ) || ( pL != pR && nr[ pL + 1 ][ pR - 1 ] != NR - 2 ) )
                continue;
 
            sol[sl++] = k + '0';
            sol[sr--] = k + '0';
            NR -= 1 + (pL != pR);
            l = pL + 1;
            r = pR - 1;
            break;
        }
    }
    printf("%s\n", sol);
 
    return 0;
}