Cod sursa(job #1551733)

Utilizator delia_99Delia Draghici delia_99 Data 16 decembrie 2015 14:53:33
Problema Elimin 2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <cstring>
using namespace std;
char s[2010];
short int D[2010][2010],st[12][2010],dr[12][2010],sol[2010];
int p1,p2,N,i;

short int maxx(short int x,short int y)
{
    if(x<y)
        return y;
    return x;
}

void aw()
{
    int i,j,L;
    for(i=1; i<=N; ++i)
        D[i][i]=1;
    for(L=2; L<=N; ++L)
        for(i=1; i<=N-L+1; ++i)
        {
            j=i+L-1;
            D[i][j]=maxx(D[i+1][j],maxx(D[i][j-1],D[i+1][j-1]+2*(s[i]==s[j])));
        }
    for(i=1; i<=N; ++i)
    {
        for(j=0; j<=9; ++j)
            st[j][i]=st[j][i-1];
        st[s[i]-'0'][i]=i;
    }
    for(i=N; i>=1; --i)
    {
        for(j=0; j<=9; ++j)
            dr[j][i]=dr[j][i+1];
        dr[s[i]-'0'][i]=i;
    }

}

void aww(short int left,short int right)
{
    short int cif,Max=0;
    if(p1>p2)
      return;
    if(p1==p2)
    {
        sol[p1]=s[left+1]-'0';
        return;
    }
    for(cif=9; cif>=0; --cif)
        Max=maxx(Max,D[dr[cif][left+1]][st[cif][right-1]]);
    for(cif=9; cif>=0; --cif)
        if(Max==D[dr[cif][left+1]][st[cif][right-1]])
        {
            if(!sol[1])
            {
                p1=1;
                p2=Max;
                N=Max;
            }
            sol[p1++]=cif;
            sol[p2--]=cif;
            aww(dr[cif][left+1],st[cif][right-1]);
            break;
        }

}

int main()
{
    freopen("elimin2.in","r",stdin);
    freopen("elimin2.out","w",stdout);
    gets(s+1);
    N=strlen(s+1);
    aw();
    p1=1;
    p2=N;
    aww(0,N+1);
    for(i=1;i<=N;++i)
      printf("%hd",sol[i]);
    return 0;
}