Cod sursa(job #2938898)

Utilizator rares89_Dumitriu Rares rares89_ Data 12 noiembrie 2022 18:49:23
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <cstring>

using namespace std;

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

string str;
short dp[2005][2005];
int Next[105][2005], Prev[105][2005];

void build(int st, int dr, int lung) { // afisare rezultat
    if(st <= dr) {
        for(int i = 9; i >= 0; i--) {
            if(dp[Next[i][st]][Prev[i][dr]] != lung) {
                continue;
            }
            fout << i;
            build(Next[i][st] + 1, Prev[i][dr] - 1, lung - 2);
            if(lung >= 2) {
                fout << i;
            }
            return;
        }
    }
}

int main() {
    fin >> str;
    int n = str.length();
    str = "#" + str;
    for(int i = 1; i <= n; i++) {
        dp[i][i] = 1;
    }
    for(int j = 0; j < 100; j++) {
        Next[j][n + 1] = n + 1;
    }
    for(int i = n; i >= 1; i--) {
        for(int j = 0; j < 10; j++) {
            Next[j][i] = Next[j][i + 1];
        }
        Next[str[i] - '0'][i] = i;
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j < 10; j++) {
            Prev[j][i] = Prev[j][i - 1];
        }
        Prev[str[i] - '0'][i] = i;
    }
    for(int l = 2; l <= n; l++) {
        for(int i = 1, j = l; j <= n; i++, j++) {
            if(str[i] == str[j]) {
                dp[i][j] = 2 + dp[i + 1][j - 1];
            } else {
                dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
            }
        }
    }
    int lung = 0;
    for(int i = 1; i < 10; i++) {
        lung = max(lung, (int) dp[Next[i][1]][Prev[i][n]]);
    }
    build(1, n, lung);
    return 0;
}