Pagini recente » Cod sursa (job #133787) | Cod sursa (job #1815265) | Cod sursa (job #1166125) | Cod sursa (job #2077183) | Cod sursa (job #2470386)
#include <bits/stdtr1c++.h>
using namespace std;
const int DELTA = 10, MAXN = 2001;
int prv[DELTA][1 + MAXN + 1], nxt[DELTA][1 + MAXN + 1];
short dp[MAXN + 1][MAXN + 1];
int n;
char s[1 + MAXN + 1];
inline void prec () {
int i, j;
for (j = 0; j < DELTA; j++)
nxt[j][n + 1] = n + 1;
for (i = n; i >= 1; i--) {
for (j = 0; j < DELTA; j++)
nxt[j][i] = nxt[j][i + 1];
nxt[s[i] - '0'][i] = i;
}
for (i = 1; i <= n; i++) {
for (j = 0; j < DELTA; j++)
prv[j][i] = prv[j][i - 1];
prv[s[i] - '0'][i] = i;
}
}
void solve (int st, int dr, int l) {
int i;
if (st > dr)
return;
for (i = DELTA - 1; i >= 0; i--)
if (dp[nxt[i][st]][prv[i][dr]] == l) {
printf ("%d", i);
solve (nxt[i][st] + 1, prv[i][dr] - 1, l - 2);
if (l >= 2)
printf ("%d", i);
return;
}
}
int main() {
int i, l, mx;
freopen ("elimin2.in", "r", stdin);
freopen ("elimin2.out", "w", stdout);
scanf ("%s", s + 1);
n = strlen (s + 1);
prec ();
for (i = 1; i <= n; i++)
dp[i][i] = 1;
for (l = 2; l <= n; l++)
for (i = 1; i + l - 1 <= n; i++)
if (s[i] == s[i + l - 1])
dp[i][i + l - 1] = dp[i + 1][i + l - 2] + 2;
else
dp[i][i + l - 1] = max (dp[i][i + l - 2], dp[i + 1][i + l - 1]);
mx = 0;
for (i = 1; i < DELTA; i++)
mx = max (mx, (int) dp[nxt[i][1]][prv[i][n]]);
solve (1, n, mx);
}