Cod sursa(job #1549832)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 12 decembrie 2015 19:40:58
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 2000 + 10;

int n , N , st , dr;
char sir[Nmax] , ans[Nmax];

short int L[Nmax][10] , R[Nmax][10];

short int dp[Nmax][Nmax];

void makeDp()
{
    for (int i = 1; i <= n; ++i) dp[i][i] = 1;

    for (int dim = 2; dim <= n; ++dim)
        for (int i = 1; i <= n - dim + 1; ++i)
            dp[i][i+dim-1] = max(short(dp[i+1][i+dim-2] + 2 * (sir[i] == sir[i+dim-1])), max(dp[i+1][i+dim-1] , dp[i][i+dim-2]));
}

void siebentauSendzweihundertvierundfunfzig()
{
    int i , j;
    for (i = 1; i <= n; ++i)
    {
        for (j = 0; j <= 9; ++j) L[i][j] = L[i-1][j];
        L[i][sir[i]-'0'] = i;
    }
    for (i = n; i ; --i)
    {
        for (j = 0; j <= 9; ++j) R[i][j] = R[i+1][j];
        R[i][sir[i]-'0'] = i;
    }
}

void puslo(int crtL , int crtR , int first)
{
    if (crtR - crtL <= 1) return;
    if (crtL + 2 == crtR) {ans[st] = sir[crtL+1]; return;}

    short int maxx = 0;
    for (int cf = 9; cf >= first; --cf)
        maxx = max(maxx , dp[R[crtL+1][cf]][L[crtR-1][cf]]);
    for (int cf = 9; cf >= first; --cf)
        if (dp[R[crtL+1][cf]][L[crtR-1][cf]] == maxx)
        {
            if (first) N = maxx, st = 0, dr = N-1;
            ans[st++] = ans[dr--] = cf + '0';
            puslo(R[crtL+1][cf] , L[crtR-1][cf] , 0);
            break;
        }
}

int main()
{
    freopen("elimin2.in","r",stdin);
    freopen("elimin2.out","w",stdout);

    gets(sir+1); n = strlen(sir+1);

    makeDp();
    siebentauSendzweihundertvierundfunfzig();
    puslo(0 , n + 1 , 1);

    puts(ans);

    return 0;
}