Cod sursa(job #1476196)

Utilizator Liviu98Dinca Liviu Liviu98 Data 24 august 2015 16:47:07
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <string.h>
#include <stdio.h>
#define NMax 2050
using namespace std;
short L[NMax][NMax],St[NMax][10],Dr[NMax][10];
int N,sol,X;
char S[NMax];

void Write(int st,int dr,int X)
{
    if(X<=0)
        return;
    for(int i=9;i>=0;i--)
        if(L[Dr[st][i]][St[dr][i]]==X)
        {
            printf("%d",i);
            Write(Dr[st][i]+1,St[dr][i]-1,X-2);
            if(X>1)
                printf("%d",i);
            return;
        }
}

inline int max(const int &x, const int &y)
{
    return (x<y?y:x);
}

int main()
{
    freopen("elimin2.in","r",stdin);
    freopen("elimin2.out","w",stdout);
    fgets(S+1,NMax,stdin);
    N=strlen(S+1)-1;

    for(int i=1;i<=N;i++)
    {
        for(int j=0;j<10;j++)
        St[i][j]=St[i-1][j];

        St[i][S[i]-'0']=i;
    }

    for(int i=N;i>=1;i--)
    {
        for(int j=0;j<10;j++)
            Dr[i][j]=Dr[i+1][j];
        Dr[i][S[i]-'0']=i;
    }

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

    for(int lenght=2;lenght<=N;lenght++)
        for(int i=1;i+lenght-1<=N;i++)
        {
            int j=i+lenght-1;
            L[i][j]=max(L[i+1][j],L[i][j-1]);
            if(S[i]==S[j])
                L[i][j]=max(L[i][j],L[i+1][j-1]+2);
        }
    for(int i=1;i<=9;i++)
        sol=max(sol,L[Dr[1][i]][St[N][i]]);
    Write(1,N,sol);
}