Cod sursa(job #1901905)

Utilizator ASTELOTudor Enescu ASTELO Data 4 martie 2017 11:55:50
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[2001],sol[2001];
int i,j,n,m,k,s1,d1,q1;
short int a[2001][2001],st[2001][10],dr[2001][10];
void detnr(int x,int y,int val)
    {
    if(y-x<=1)
        return;
    if(y-x==2)
        {
        sol[s1]=s[x+1];
        return ;
        }
    short int best=0;
    int i;
    for(i=9;i>=val;i--)
        best=max(best,a[dr[x+1][i]][st[y-1][i]]);
    for(i=9;i>=val;i--)
        if(a[dr[x+1][i]][st[y-1][i]]==best)
            {
            if(val!=0)
                {
                q1=best;
                s1=0;
                d1=best-1;
                }
            sol[s1]=sol[d1]=i+'0';
            s1++;
            d1--;
            detnr(dr[x+1][i],st[y-1][i],0);
            break;
            }
    }
int main ()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(s);
n=strlen(s);
for(i=n;i>=1;i--)
    s[i]=s[i-1];
for(i=1;i<=n;i++)
    a[i][i]=1;
for(j=2;j<=n;j++)
    for(i=1;i<=n-j+1;i++)
        {
        int q=i+j-1;
        a[i][q]=max(short(a[i+1][q-1]+2*(s[i]==s[q])),max(a[i+1][q],a[i][q-1]));
        }
for(i=1;i<=n;i++)
    {
    for(j=0;j<=9;j++)
        st[i][j]=st[i-1][j];
    st[i][s[i]-'0']=i;
    }
for(i=n;i>=1;i--)
    {
    for(j=0;j<=9;j++)
        dr[i][j]=dr[i+1][j];
    dr[i][s[i]-'0']=i;
    }
detnr(0,n+1,1);
puts(sol);
return 0;
}