Cod sursa(job #2025367)

Utilizator refugiatBoni Daniel Stefan refugiat Data 22 septembrie 2017 17:17:16
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream si("elimin2.in");
ofstream so("elimin2.out");
char s[2005],sol[2005];
short d[2005][2005],nxt[2005][10],pr[2005][10];
int fir,last;
inline void solve(int st,int dr,int lg)
{
    if(st>dr)
        return;
    if(lg<0)
        return;
    for(int i=9;i>=0;i--)
    {
        if(d[nxt[st][i]][pr[dr][i]]==lg)
        {
            sol[fir++]=(char)(i+'0');
            sol[last--]=(char)(i+'0');
            solve(nxt[st][i]+1,pr[dr][i]-1,lg-2);
            return;
        }
    }
    return;
}
int main()
{
    si>>s+1;
    int n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=9;j++)
        {
            pr[i][j]=pr[i-1][j];
        }
        pr[i][s[i]-'0']=i;
    }
    for(int i=0;i<=9;i++)
        nxt[n+1][i]=n+1;
    for(int i=n;i>=1;i--)
    {
        for(int j=0;j<=9;j++)
        {
            nxt[i][j]=nxt[i+1][j];
        }
        nxt[i][s[i]-'0']=i;
    }
    for(int i=1;i<=n;i++)
        d[i][i]=1;
    for(int lg=2;lg<=n;lg++)
    {
        for(int i=1;i<=n-lg+1;i++)
        {
            if(s[i]==s[i+lg-1])
            {
                d[i][i+lg-1]=max(d[i][i+lg-1],(short)(2+d[i+1][i+lg-2]));
            }
            else
            {
                d[i][i+lg-1]=max(d[i][i+lg-1],max(d[i+1][i+lg-1],d[i][i+lg-2]));
            }
        }
    }
    short l=0;
    for(int i=1;i<=9;i++)
    {
        l=max(l,d[nxt[1][i]][pr[n][i]]);
    }
    fir=0;
    last=l-1;
    solve(1,n,l);
    so<<sol;
    return 0;
}