Pagini recente » Cod sursa (job #393919) | Cod sursa (job #384689) | Cod sursa (job #517538) | Cod sursa (job #2489647) | Cod sursa (job #45787)
Cod sursa(job #45787)
#include <stdio.h>
#include <string.h>
#define MAX_N 2048
#define FIN "elimin2.in"
#define FOUT "elimin2.out"
#define max(a, b) ((a) > (b) ? (a) : (b))
short N, L[MAX_N][10], R[MAX_N][10], A[MAX_N][MAX_N];
char S[MAX_N], Res[MAX_N];
int main(void)
{
int i, j, c, d, l, r, len;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%s", S);
N = strlen(S);
for (i = 0; i < 10; i++) L[N][i] = N;
for (i = N-1; i >= 0; i--)
for (j = 0; j < 10; j++)
L[i][j] = S[i] == j+'0' ? i : L[i+1][j];
for (i = 0; i < 10; i++) R[0][i] = S[0] == i+'0' ? 0 : -1;
for (i = 1; i < N; i++)
for (j = 0; j < 10; j++)
R[i][j] = S[i] == j+'0' ? i : R[i-1][j];
for (i = 0; i < N; i++) A[i][i] = 1;
for (i = 0; i+1 < N; i++) A[i][i+1] = S[i] == S[i+1] ? 2 : 1;
for (d = 2; d < N; d++)
for (i = 0; i+d < N; i++)
{
j = i+d;
if (S[i] == S[j])
A[i][j] = A[i+1][j-1]+2;
else
A[i][j] = max(A[i+1][j], A[i][j-1]);
}
for (i = 0, j = N-1, d = 0; i <= j; d++)
{
len = 0;
for (c = 9; c >= (!i ? 1 : 0); c--)
{
l = L[i][c]; r = R[j][c];
if (l <= r && len < A[l+1][r-1]+1+(l<r))
{
len = A[l+1][r-1]+1+(l<r);
Res[d] = c+'0';
}
}
Res[d+len-1] = Res[d]; c = Res[d]-'0';
i = L[i][c]+1; j = R[j][c]-1;
}
for (i = 0; Res[i]; i++)
printf("%c", Res[i]);
printf("\n");
return 0;
}