Pagini recente » Cod sursa (job #1043047) | Cod sursa (job #1370975) | Cod sursa (job #2612548) | Cod sursa (job #959291) | Cod sursa (job #2629913)
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
const int N = 2000 + 7;
int n, c[N], dp[N][N], nxt[N][10], ant[N][10];
string s;
void print(int l, int r) {
if (l > r) {
return;
}
if (l == r) {
cout << c[l];
return;
}
if (c[l] == c[r]) {
cout << c[l];
print(l + 1, r - 1);
cout << c[r];
return;
}
for (int x = 9; x >= 0; x--) {
int p1 = nxt[l][x];
int p2 = ant[r][x];
if (p1 > p2) {
continue;
}
if (dp[p1][p2] == dp[l][r]) {
print(p1, p2);
return;
}
}
}
int main() {
freopen ("elimin2.in", "r", stdin);
freopen ("elimin2.out", "w", stdout);
cin >> s;
n = (int) s.size();
for (int i = 1; i <= n; i++) {
c[i] = s[i - 1] - '0';
for (int x = 0; x <= 9; x++) {
ant[i][x] = ant[i - 1][x];
}
ant[i][c[i]] = i;
}
for (int x = 0; x <= 9; x++) {
nxt[n + 1][x] = n + 1;
}
for (int i = n; i >= 1; i--) {
for (int x = 0; x <= 9; x++) {
nxt[i][x] = nxt[i + 1][x];
}
nxt[i][c[i]] = i;
}
for (int l = n; l >= 1; l--) {
dp[l][l] = 1;
for (int r = l + 1; r <= n; r++) {
if (c[l] == c[r]) {
dp[l][r] = dp[l + 1][r - 1] + 2;
} else {
dp[l][r] = max(dp[l + 1][r], dp[l][r - 1]);
}
}
}
int be = 0;
for (int x = 1; x <= 9; x++) {
int l = nxt[1][x];
int r = ant[n][x];
if (l > r) {
continue;
}
be = max(be, dp[l][r]);
}
for (int x = 9; x >= 1; x--) {
int l = nxt[1][x];
int r = ant[n][x];
if (l > r) {
continue;
}
if (dp[l][r] == be) {
print(l, r);
return 0;
}
}
return 0;
}