Cod sursa(job #2715375)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 3 martie 2021 16:30:03
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

#define NMAX 2005
using namespace std;

ifstream fin("elimin2.in");
ofstream fout("elimin2.out");

short lf[NMAX][10], rg[NMAX][10], dp[NMAX][NMAX];
bool ok = 0;

void recur(short st, short dr, short lg)
{
    if(lg <= 0)
        return;
    for(short cif = 9; cif >= 0; --cif)
        if(dp[rg[st][cif]][lf[dr][cif]] == lg)
        {
            fout << cif;
            recur(rg[st][cif] + 1, lf[dr][cif] - 1, lg - 2);
            if(lg > 1)
                fout << cif;
            ok = 1;
            return;
        }
}

int main()
{
    string s;
    fin >> s;

    short n = s.size();
    for(short i = 1; i <= n; ++i)
    {
        for(short cif = 0; cif <= 9; ++cif)
            lf[i][cif] = lf[i - 1][cif];
        lf[i][s[i - 1] - '0'] = i;
    }

    for(short i = n; i >= 1; --i)
    {
        for(short cif = 0; cif <= 9; ++cif)
            rg[i][cif] = rg[i + 1][cif];
        rg[i][s[i - 1] - '0'] = i;
    }

    for(short i = 1; i <= n; ++i)
        dp[i][i] = 1;

    for(short lg = 2; lg <= n; ++lg)
        for(short i = 1; i <= n - lg + 1; ++i)
        {
            short j = i + lg - 1;
            if(s[i - 1] == s[j - 1])
                dp[i][j] = dp[i + 1][j - 1] + 2;
            else dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
        }

    short maxx = 0;
    for(short cif = 9; cif >= 1; --cif)
        maxx = max(maxx, dp[rg[1][cif]][lf[n][cif]]);

    recur(1, n, maxx);

    if(!ok)
        fout << 0 << '\n';
    return 0;
}