Pagini recente » Cod sursa (job #2056726) | Cod sursa (job #1480091) | Cod sursa (job #2801568) | Cod sursa (job #2198766) | Cod sursa (job #940439)
Cod sursa(job #940439)
#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 k = 0; k < 10; k++)
last[0][k] = 0;
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 (l == 1 && k == 0 && NR > 1)
{
NR -= 2; sr -= 2;
break;
}
int pL, pR;
pL = first[l][k];
pR = last[r][k];
if (pL == N + 1 || pR == 0) continue;
if (pL > pR) continue;
if ( ( pL == pR && NR != 1 ) || ( pL != pR && nr[ pL + 1 ][ pR - 1 ] != NR - 2 ) )
continue;
sol[sl++] = k + '0';
sol[sr--] = k + '0';
NR -= 1 + (pL != pR);
l = pL + 1;
r = pR - 1;
break;
}
}
printf("%s\n", sol);
return 0;
}