Cod sursa(job #491959)
#include <stdio.h>
#include <string.h>
int n;
char v[2005];
short int d[2003][2003], st[2003][10], dr[2003][10];
inline int max (int a, int b) {return a > b ? a : b;}
void print (int p, int u, int sol)
{
if (sol < 1)
return;
int i;
for (i = 9; i >= 0; i --)
if (d[dr[p][i]][st[u][i]] == sol)
break;
printf ("%d", i);
print (dr[p][i] + 1, st[u][i] - 1, sol - 2);
if (sol > 1)
printf ("%d", i);
}
int main ()
{
freopen ("elimin2.in", "r", stdin);
freopen ("elimin2.out", "w", stdout);
gets (v + 1);
n = strlen (v + 1);
int i, j, l, sol = 0;
for (i = 1; i <= n; i ++)
for (j = 0; j <= 9; j ++)
{
st[i][j] = st[i - 1][j];
if (v[i] == j + '0')
st[i][j] = i;
}
for (j = 0; j <= 9; j ++)
dr[n + 1][j] = n + 1;
for (i = n; i >= 1; i --)
for (j = 0; j <= 9; j ++)
{
dr[i][j] = dr[i + 1][j];
if (v[i] == j + '0')
dr[i][j] = i;
}
for (i = 1; i <= n; i ++)
d[i][i] = 1;
for (l = 2; l <= n; l ++)
for (i = 1; i <= n - l + 1; i ++)
{
j = i + l - 1;
d[i][j] = max (d[i + 1][j], d[i][j - 1]);
if (v[i] == v[j])
d[i][j] = max (d[i][j], d[i + 1][j - 1] + 2);
}
for (i = 1; i <= 9; i ++)
sol = max (sol, d[dr[1][i]][st[n][i]]);
print (1, n, sol);
return 0;
}