Cod sursa(job #1004404)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 2 octombrie 2013 18:07:13
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("elimin2.in");
ofstream g("elimin2.out");
short i,j,maxi,nm,n,di,v[2020],d[2020][2020],pr[2020][11],ul[2020][11];
char s[2020];
inline void afis(short x,short y)
{
    if(x>y||!x)
    return ;
    if(x==y)
    {
        g<<v[x];
        return ;
    }
    if(v[x]==v[y])
    g<<v[x];
    for(i=9;i>=0;--i)
    if(d[pr[x+1][i]][ul[y-1][i]]+2==d[x][y])
    {
        afis(pr[x+1][i],ul[y-1][i]);
        break;
    }
    if(v[x]==v[y])
    g<<v[x];
}////////////////
int main()
{//////////////
    f>>(s+1);
    n=strlen(s+1);
    for(i=1;i<=n;++i)
    v[i]=s[i]-'0';
    for(i=1;i<=n;++i)
    {
        for(j=0;j<=9;++j)
        ul[i][j]=ul[i-1][j];
        ul[i][v[i]]=i;
    }
    for(i=n;i;--i)
    {
       for(j=0;j<=9;++j)
       pr[i][j]=pr[i+1][j];
       pr[i][v[i]]=i;
    }
    for(i=1;i<=n;++i)
    {
        d[i][i]=1;
    }
    for(di=2;di<=n;++di)
    {
        for(j=di;j<=n;++j)
        {
            i=j-di+1;
            if(v[i]==v[j])
            d[i][j]=d[i+1][j-1]+2;
            else
            d[i][j]=max(d[i+1][j],d[i][j-1]);
        }
    }
    maxi=1;
    for(i=1;i<=n;++i)
    if(v[i]>v[maxi])
    maxi=i;
    nm=i;
    for(i=10;i;--i)
    if(d[pr[1][i]][ul[n][i]]>d[maxi][nm])
    maxi=pr[1][i],nm=ul[n][i];
    afis(maxi,nm);
    g<<'\n';
    return 0;
}