Pagini recente » Cod sursa (job #72859) | Cod sursa (job #1516704) | Cod sursa (job #2618586) | Cod sursa (job #644398) | Cod sursa (job #2504094)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1000000000;
const int NMAX = 2003;
const int NRCIF = 11;
char s[NMAX];
short dp[NMAX][NMAX];
short st[NMAX][NRCIF];
short dr[NMAX][NRCIF];
void sol(int x, int y) {
if(x > y) {
return ;
}
if(x == y) {
printf("%c", s[x]);
return ;
}
if(x == y - 1) {
printf("%c%c", s[x], s[x]);
return ;
}
printf("%c", s[x]);
for(int i = 9; i > -1; i--) {
if(dp[dr[x][i]][st[y][i]] == dp[x][y] - 2) {
sol(dr[x][i], st[y][i]);
printf("%c", s[x]);
return ;
}
}
}
int main() {
freopen("elimin2.in", "r", stdin);
freopen("elimin2.out", "w", stdout);
scanf("%s", s + 1);
int n = (int)strlen(s + 1);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
dp[i][j] = INF;
}
}
for(int i = 1; i <= n; i++) {
dp[i][i] = 1;
dp[i][i - 1] = 0;
}
for(int i = n; i > 0; i--) {
for(int l = 2; i + l - 1 <= n; l++) {
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 + 1][i + l - 1], dp[i][i + l - 2]);
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= 9; j++) {
if(s[i] - '0' == j) {
st[i][j] = i;
}
else {
st[i][j] = st[i - 1][j];
}
}
}
for(int i = n; i > 0; i--) {
for(int j = 0; j <= 9; j++) {
if(s[i] - '0' == j) {
dr[i][j] = i;
}
else {
dr[i][j] = dr[i + 1][j];
}
}
}
for(int i = 9; i > 0; i--) {
if(dp[dr[1][i]][st[n][i]] == dp[1][n]) {
sol(dr[1][i], st[n][i]);
return 0;
}
}
return 0;
}