Cod sursa(job #2148030)

Utilizator NeredesinI am not real Neredesin Data 1 martie 2018 14:48:06
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define ch(i) (s[i] - '0')

using namespace std;

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

const short int NMAX = 2001 + 10;

short int n;
short int ap1[NMAX][10];
short int ap2[NMAX][10];
short int dp[NMAX][NMAX];
char s[NMAX];

void write(short int from, short int to) {
  if(from == to && from != 0) {
    out << ch(from);
  } else if(from < to && from != 0) {
    if(ch(from) == ch(to))
      out << ch(from);

    for(short int i = 9; i >= 0; i--) {
      if(dp[ap1[from + 1][i]][ap2[to - 1][i]] + 2 == dp[from][to]) {
        write(ap1[from + 1][i], ap2[to - 1][i]);
        break;
      }
    }

    if(ch(from) == ch(to))
      out << ch(from);
  }
}

int main()
{
  in >> (s + 1);
  n = strlen(s + 1);

  for(short int i = n; i >= 1; i--) {
    for(short int j = 0; j <= 9; j++)
      ap1[i][j] = ap1[i + 1][j];
    ap1[i][ch(i)] = i;
  }

  for(short int i = 1; i <= n; i++) {
    for(short int j = 0; j <= 9; j++)
      ap2[i][j] = ap2[i - 1][j];
    ap2[i][ch(i)] = i;

    dp[i][i] = 1;
  }

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

  short int from = 1;
  short int to = n + 1;

  for(short int i = 1; i <= n; i++) {
    if(ch(i) > ch(from))
      from = i;
  }

  for(short int i = 10; i >= 1; i--) {
    if(dp[from][to] < dp[ap1[1][i]][ap2[n][i]]) {
      from = ap1[1][i];
      to = ap2[n][i];
    }
  }

  write(from, to);
  out << '\n';

  in.close();
  out.close();
  return 0;
}