Pagini recente » Cod sursa (job #443789) | Cod sursa (job #3036518) | Cod sursa (job #2285669) | Cod sursa (job #2480330) | Cod sursa (job #37939)
Cod sursa(job #37939)
#include <stdio.h>
#include <string.h>
#define MAXN 2005
int N, x[MAXN];
short nr[MAXN][MAXN];
short first[MAXN][10], last[MAXN][10];
char sol[MAXN];
int main()
{
freopen("elimin2.in", "rt", stdin);
freopen("elimin2.out", "wt", stdout);
for (char c; scanf(" %c ", &c) != EOF; )
x[++N] = c - '0';
for (int k = 0; k < 10; k++)
first[N + 1][k] = N + 1;
for (int i = N; i; i--)
{
for (int k = 0; k < 10; k++)
first[i][k] = first[i + 1][k];
first[i][ x[i] ] = i;
}
for (int i = 1; i <= N; i++)
{
for (int k = 0; k < 10; k++)
last[i][k] = last[i - 1][k];
last[i][ x[i] ] = i;
}
memset( nr, 0x3f, sizeof(nr) );
for (int i = 1; i <= N; i++)
nr[i][i] = 1, nr[i][i - 1] = 0;
for (int i = N; i > 0; i--)
for (int j = i + 1; j <= N; j++)
{
nr[i][j] = nr[i][j - 1];
if (nr[i + 1][j] > nr[i][j])
nr[i][j] = nr[i + 1][j];
if (x[i] == x[j] && nr[i + 1][j - 1] + 2 > nr[i][j])
nr[i][j] = nr[i + 1][j - 1] + 2;
}
int NR = nr[1][N], l = 1, r = N, sl = 0, sr = NR - 1;
for (; NR; )
{
for (int k = 9; k >= 0; k--)
{
if (first[l][k] == N + 1) continue;
if (last[r][k] == 0) continue;
if (l == 1 && k == 0)
{
NR -= 2;
continue;
}
if (first[l][k] > last[r][k]) continue;
if (nr[ first[l][k] ][ last[r][k] ] != NR)
continue;
sol[sl++] = k + '0';
sol[sr--] = k + '0';
NR--;
NR -= (first[l][k] != last[r][k]);
l = first[l][k] + 1;
r = last[r][k] - 1;
}
}
printf("%s\n", sol);
return 0;
}