Pagini recente » Cod sursa (job #26161) | Cod sursa (job #2480240) | Cod sursa (job #2871758) | Cod sursa (job #2111751) | Cod sursa (job #38423)
Cod sursa(job #38423)
#include <stdio.h>
#include <string.h>
#define MAXN 2048
int N, M, K, L, LG, B[MAXN], sol[MAXN], prev[MAXN][10];
short int A[MAXN][MAXN];
void solve(void)
{
int i, j, k, t = 0, p, cmax, poz;
A[N][N] = 1;
for(j = 0; j <= 9; j++)
for(i = 1; i <= N; i++)
if(B[i] == j)
prev[i][j] = i;
else
prev[i][j] = prev[i-1][j];
for(i = N-1; i >= 1; i--)
for(A[i][i] = 1, j = i+1; j <= N; j++)
{
A[i][j] = A[i+1][j];
if(prev[j][ B[i] ] > i)
{
k = prev[j][B[i]];
if(A[i+1][k-1]+2 > A[i][j])
A[i][j] = A[i+1][k-1]+2;
}
}
LG = L = A[1][N], i = 1, j = N;
while(L)
{
if(L == 1)
{
for(cmax = -1, k = i; k <= j; k++)
if(B[k] > cmax)
cmax = B[k];
sol[++K] = cmax;
L--;
}
else
{
for(cmax = -1, k = i; k <= j; k++)
if(B[k] > cmax && A[k][j] == L)
{
p = prev[j][B[k]];
if(p > k && A[k+1][p-1] == L-2)
poz = k, cmax = B[k];
}
sol[++K] = cmax, i = poz+1, j = prev[j][B[poz]]-1;
L -= 2;
}
}
}
void read_data(void)
{
int i, j, k;
char sir[3000];
scanf("%s\n", &sir), N = strlen(sir);
for(i = 1; i <= N; i++)
B[i] = sir[i-1]-'0';
}
void write_data(void)
{
int i, j;
for(i = 1; sol[i] == 0; i++) ;
if(LG & 1) // lungime impara
{
for(j = i; j <= K; j++)
printf("%d", sol[j]);
for(j = K-1; j >= i; j--)
printf("%d", sol[j]);
printf("\n");
}
else // lungime para
{
for(j = i; j <= K; j++)
printf("%d", sol[j]);
for(j = K; j >= i; j--)
printf("%d", sol[j]);
printf("\n");
}
}
int main(void)
{
freopen("elimin2.in", "rt", stdin);
freopen("elimin2.out", "wt", stdout);
read_data();
solve();
write_data();
return 0;
}