Cod sursa(job #1696907)

Utilizator sucureiSucureiRobert sucurei Data 30 aprilie 2016 12:08:02
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#include<string.h>

#define maxim(a,b) (a>b ? a : b)

short int d[2005][2005],sol,n;
int dr[10][2005],st[10][2005];
char s[2005];

void recur(int inc,int sf,int lg)
{
    int i;
    if(lg<1)
        return ;
    for(i=9;i>=0;i--)
        if(d[dr[i][inc]][st[i][sf]]==lg)
        {
            printf("%d",i);
            recur(dr[i][inc]+1,st[i][sf]-1,lg-2);
            if(lg>1)
                printf("%d",i);
            return ;
        }
}

int main ()
{
    int i,j,l;
    freopen("elimin2.in","r",stdin);
    freopen("elimin2.out","w",stdout);
    scanf("%s",s+1);
    n=strlen(s+1);
    for(i=1;i<=n;i++)
        d[i][i]=1;
    for(l=1;l<n;l++)
        for(i=1;i<=n-l;i++)
        {
            j=i+l;
            d[i][j]=maxim(d[i+1][j],d[i][j-1]);
            if(s[i]==s[j])
                d[i][j]=maxim(d[i][j],d[i+1][j-1]+2);
        }
    for(i=0;i<=9;i++)
    {
        for(j=1;j<=n;j++)
            if(s[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(s[j]-'0'==i)
                dr[i][j]=j;
            else
                dr[i][j]=dr[i][j+1];
    }
    for(i=1;i<=9;i++)
        sol=maxim(sol,d[dr[i][1]][st[i][n]]);
    recur(1,n,sol);
    printf("\n");
    return 0;
}