Cod sursa(job #2504094)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 4 decembrie 2019 13:34:46
Problema Elimin 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1000000000;
const int NMAX = 2003;
const int NRCIF = 11;
char s[NMAX];
short dp[NMAX][NMAX];
short st[NMAX][NRCIF];
short dr[NMAX][NRCIF];
void sol(int x, int y) {
    if(x > y) {
        return ;
    }
    if(x == y) {
        printf("%c", s[x]);
        return ;
    }
    if(x == y - 1) {
        printf("%c%c", s[x], s[x]);
        return ;
    }
    printf("%c", s[x]);
    for(int i = 9; i > -1; i--) {
        if(dp[dr[x][i]][st[y][i]] == dp[x][y] - 2) {
            sol(dr[x][i], st[y][i]);
            printf("%c", s[x]);
            return ;
        }
    }
}

int main() {
    freopen("elimin2.in", "r", stdin);
    freopen("elimin2.out", "w", stdout);
    scanf("%s", s + 1);
    int n = (int)strlen(s + 1);
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            dp[i][j] = INF;
        }
    }
    for(int i = 1; i <= n; i++) {
        dp[i][i] = 1;
        dp[i][i - 1] = 0;
    }
    for(int i = n; i > 0; i--) {
        for(int l = 2; i + l - 1 <= n; l++) {
            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]);
            }
        }
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= 9; j++) {
            if(s[i] - '0' == j) {
                st[i][j] = i;
            }
            else {
                st[i][j] = st[i - 1][j];
            }
        }
    }
    for(int i = n; i > 0; i--) {
        for(int j = 0; j <= 9; j++) {
            if(s[i] - '0' == j) {
                dr[i][j] = i;
            }
            else {
                dr[i][j] = dr[i + 1][j];
            }
        }
    }
    for(int i = 9; i > 0; i--) {
        if(dp[dr[1][i]][st[n][i]] == dp[1][n]) {
            sol(dr[1][i], st[n][i]);
            return 0;
        }
    }
    return 0;
}