Cod sursa(job #2470382)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 9 octombrie 2019 09:25:22
Problema Elimin 2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb

#include <fstream>
#include <cstring>
using namespace std;
ifstream f("elimin2.in");
ofstream g("elimin2.out");

int  ant[2005][11],urm[2005][11],n;
short dp[2005][2005];
char s[2005];
inline void calc()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=9;j>=0;j--)
        {
            ant[i][j]=ant[i-1][j];
        }
        ant[i][s[i]-'0']=i;
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=9;j>=0;j--)
        {
            urm[i][j]=urm[i+1][j];
        }
        urm[i][s[i]-'0']=i;
    }
}
void rezolva()
{
    for(int i=1;i<=n;i++) dp[i][i]=1;
    for(int l=2;l<=n;l++)
    {
        for(int i=1;i+l-1<=n;i++)
        {
            if(s[i]==s[i+l-1])
                dp[i][i+l-1]=dp[i+1][i+l-2]+2;
            else
            {
                dp[i][i+l-1]=max(dp[i+1][i+l-1],dp[i][i+l-2]);
            }
        }
    }

}
void afis(int st,int dr,int val)
{if(st>dr) return ;
    for(int i=9;i>=0;i--)
    {
        if(dp[urm[st][i]][ant[dr][i]]==val) {
                g<<i;
        afis(urm[st][i]+1,ant[dr][i]-1,val-2);
        if(val>=2) g<<i;
        return ;
        }
    }
}
int main()
{
    f>>(s+1);
   n=strlen(s+1);

   calc();

  rezolva();

   int maxim=0;

   for(int i=1;i<=n;i++)
   {
       maxim=max(maxim,(int)dp[urm[1][i]][ant[n][i]]);
   }
   afis(1,n,maxim);



}