Cod sursa(job #559566)

Utilizator DraStiKDragos Oprica DraStiK Data 17 martie 2011 21:49:53
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <algorithm>
using namespace std;

#define DIM 2001
#define MAX 10

short bst[DIM][DIM],st[MAX][DIM],dr[MAX][DIM];
char buff[DIM];
int N;

inline short max (short a,short b)
{
    if (a>b)
        return a;

    return b;
}

void read ()
{
    fgets (buff+1,DIM,stdin);
    N=strlen (buff+1)-(buff[strlen (buff+1)]=='\n');
}

void print (int in,int sf,int val)
{
    int i;

    if (!val)
        return ;

    for (i=MAX-1; i>=0; --i)
        if (bst[dr[i][in]][st[i][sf]]==val)
        {
            printf ("%d",i);
            print (dr[i][in]+1,st[i][sf]-1,val-2);

            if (val>1)
                printf ("%d",i);
            return ;
        }
}

void solve ()
{
    int lg,i,j,max_val;

    for (i=0; i<MAX; ++i)
    {
        st[i][0]=0;
        for (j=1; j<=N; ++j)
            if (buff[j]-'0'==i)
                st[i][j]=j;
            else
                st[i][j]=st[i][j-1];

        dr[i][N+1]=N+1;
        for (j=N; j>=1; --j)
            if (buff[j]-'0'==i)
                dr[i][j]=j;
            else
                dr[i][j]=dr[i][j+1];
    }

    for (i=1; i<=N; ++i)
        bst[i][i]=1;

    for (lg=2; lg<=N; ++lg)
        for (i=1; i+lg-1<=N; ++i)
        {
            j=i+lg-1;

            bst[i][j]=max (bst[i+1][j],bst[i][j-1]);
            if (buff[i]==buff[j])
                bst[i][j]=max (bst[i][j],bst[i+1][j-1]+2);
        }

    max_val=0;
    for (i=MAX-1; i>=1; --i)
        max_val=max (max_val,bst[dr[i][1]][st[i][N]]);
    print (1,N,max_val);
}

int main ()
{
    freopen ("elimin2.in","r",stdin);
    freopen ("elimin2.out","w",stdout);

    read ();
    solve ();

    return 0;
}