Cod sursa(job #1768863)

Utilizator cristina_borzaCristina Borza cristina_borza Data 1 octombrie 2016 16:12:03
Problema Elimin 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f ("elimin2.in");
ofstream g ("elimin2.out");

int dp[2005][2005] , dr[2005][15] , st[2005][15] , v[2005];
int n;

char sir[2005];

void afis (int inc , int sf);

int main() {
    f >> sir + 1;
    n = strlen(sir + 1);

    for (int i = 1; i <= n; ++i) {
        v[i] = sir[i] - '0';
    }

    for (int k = 0; k < 10; k++)
        dr[n + 1][k] = n + 1;

    for (int i = n; i >= 0; i--) {
        for (int k = 0; k < 10; k++)
            dr[i][k] = dr[i + 1][k];

        dr[i][v[i]] = i;
    }

    for (int k = 0; k < 10; k++)
        st[0][k] = 0;

    for (int i = 1; i <= n + 1; i++) {
        for (int k = 0; k < 10; k++)
            st[i][k] = st[i - 1][k];

        st[i][v[i]] = i;
    }

    for (int i = 1; i <= n; ++i) {
        dr[i][v[i]] = dr[i + 1][v[i]];
    }

    for (int i = n; i >= 1; --i) {
        st[i][v[i]] = st[i - 1][v[i]];
    }

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

    for (int d = 2; d <= n; ++d) {
        for (int i = 1; i <= n - d + 1; ++i) {
            int j = i + d - 1;
            if (j > n) {
                break;
            }

            int aux1 = 0;
            if (dr[i][v[i]] <= j)
                aux1 = dp[i + 1][dr[i][v[i]] - 1] + 2;

            if (st[j][v[j]] >= i)
                aux1 = max (aux1 , dp[st[j][v[j]] + 1][j - 1] + 2);

            int aux2 = max (dp[i][j - 1] , dp[i - 1][j]);

            dp[i][j] = max (aux1 , aux2);

            if (v[i] == v[j]) {
                dp[i][j] = max (dp[i][j] , 2 + dp[i + 1][j - 1]);
            }
        }
    }

    int p1 , p2 , mx = 0 , pos;
    for (int i = 1; i <= 9; ++i) {
        if (dp[dr[0][i]][st[n + 1][i]] >= mx) {
            mx = dp[dr[0][i]][st[n + 1][i]];
            p1 = dr[0][i];

            p2 = st[n + 1][i];
            pos = i;
        }
    }

    g << pos;
    afis (p1 + 1 , p2 - 1);

    if (dp[1][n] > 1) {
        g << pos;
    }
    return 0;
}

void afis (int inc , int sf) {
    if (sf < inc) {
        return;
    }

    int p1 , p2 , mx = 0 , pos;
    for (int i = 0; i <= 9; ++i) {
        if (dp[dr[inc - 1][i]][st[sf + 1][i]] >= mx) {
            mx = dp[dr[inc - 1][i]][st[sf + 1][i]];
            p1 = dr[inc - 1][i];

            p2 = st[sf + 1][i];
            pos = i;
        }
    }

    g << pos;
    afis (p1 + 1 , p2 - 1);

    if (p2 != p1) {
        g << pos;
    }
}