Pagini recente » Cod sursa (job #2902085) | Cod sursa (job #2306937) | Cod sursa (job #1761483) | Cod sursa (job #2017417) | Cod sursa (job #844891)
Cod sursa(job #844891)
#include <stdio.h>
#include <string.h>
#define MAXN 2050
#define SIGMA 10
short D[MAXN][MAXN];
char S[MAXN];
short St[MAXN][SIGMA];
short Dr[MAXN][SIGMA];
int i, j, lung;
int N, Ans;
inline int max(const int &a, const int &b)
{
return (a<b ? b : a);
}
void afis(int st, int dr, short val)
{
if (val <= 0) return;
for (int i = SIGMA - 1; i >= 0; --i)
if (D[ Dr[st][i] ][ St[dr][i] ] == val){
printf("%d",i);
afis(Dr[st][i]+1, St[dr][i] - 1, val-2);
if (val > 1)
printf("%d", i);
return;
}
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
fgets(S+1, MAXN, stdin);
N = strlen(S+1) - 1;
for (i = 1; i <= N; ++i){
for (j = 0; j < SIGMA; ++j)
St[i][j] = St[i-1][j];
St[i][S[i]-'0'] = i;
}
for (i = N; i >= 1; --i){
for (j = 0; j < SIGMA; ++j)
Dr[i][j] = Dr[i+1][j];
Dr[i][S[i]-'0'] = i;
}
for (i = 1; i <= N; ++i)
D[i][i] = 1;
for (lung = 2; lung <= N; ++lung)
for (i = 1; i + lung - 1 <= N; ++i){
j = i + lung - 1;
D[i][j] = max(D[i+1][j], D[i][j-1]);
if (S[i] == S[j])
D[i][j] = max(D[i][j], D[i+1][j-1] + 2);
}
Ans = 0;
for (i = 1; i < SIGMA; ++i)
Ans = max(Ans, D[ Dr[1][i] ][ St[N][i] ]);
afis(1, N, Ans);
return 0;
}