Pagini recente » Cod sursa (job #1950520) | Cod sursa (job #651077) | Cod sursa (job #2625826) | Cod sursa (job #30553) | Cod sursa (job #2504099)
#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, int nr) {
if(x > y) {
return ;
}
for(int i = 9; i > -1; i--) {
if(dp[dr[x][i]][st[y][i]] == nr) {
printf("%d", i);
sol(dr[x][i] + 1, st[y][i] - 1, nr - 2);
if(nr > 1) {
printf("%d", i);
}
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];
}
}
}
int x = 0, cif;
for(int i = 9; i > 0; i--) {
if(dp[dr[1][i]][st[n][i]] > x) {
x = dp[dr[1][i]][st[n][i]];
cif = i;
}
}
sol(1, n, x);
return 0;
}