Cod sursa(job #2635087)

Utilizator lucametehauDart Monkey lucametehau Data 13 iulie 2020 11:29:01
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream cin ("elimin2.in");
ofstream cout ("elimin2.out");

int n;

char s[2005];
short dp[2005][2005], l[2005][10], r[2005][10];

void solve(int a, int b, int val) {
  if(val <= 0)
    return;
  for(int i = 9; i >= 0; i--) {
    if(dp[r[a][i]][l[b][i]] == val) {
      cout << i;
      solve(r[a][i] + 1, l[b][i] - 1, val - 2);
      if(val != 1)
        cout << i;
      break;
    }
  }
}

int main() {
  cin >> (s + 1);
  n = strlen(s + 1);
  for(int i = 1; i <= n; i++) {
    for(int j = 0; j <= 9; j++)
      l[i][j] = l[i - 1][j];
    l[i][s[i] - '0'] = i;
  }
  for(int i = n; i >= 1; i--) {
    for(int j = 0; j <= 9; j++)
      r[i][j] = r[i + 1][j];
    r[i][s[i] - '0'] = i;
  }
  for(int i = n; i >= 1; i--) {
    dp[i][i] = 1;
    for(int j = i + 1; j <= n; j++) {
      if(s[i] == s[j])
        dp[i][j] = dp[i + 1][j - 1] + 2;
      else
        dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
    }
  }
  short ans = 0;
  for(int i = 1; i <= 9; i++)
    ans = max(ans, dp[r[1][i]][l[n][i]]);
  solve(1, n, ans);
  return 0;
}