Pagini recente » Cod sursa (job #3265731) | Cod sursa (job #74277) | Cod sursa (job #527772) | Cod sursa (job #1752602) | Cod sursa (job #2148003)
#include <iostream>
#include <fstream>
#include <cstring>
#define ch(i) (s[i] - '0')
using namespace std;
ifstream in("elimin2.in");
ofstream out("elimin2.out");
const int NMAX = 2001 + 10;
int n;
int ap1[NMAX][10];
int ap2[NMAX][10];
int dp[NMAX][NMAX];
char s[NMAX];
void write(int from, int to) {
if(from == to && from < to && from != 0) {
out << ch(from);
} else if(from < to && from != 0) {
if(ch(from) == ch(to))
out << ch(from);
for(int i = 9; i >= 0; i--) {
if(dp[ap1[from + 1][i]][ap2[to - 1][i]] + 2 == dp[from][to]) {
write(ap1[from + 1][i], ap2[to - 1][i]);
break;
}
}
if(ch(from) == ch(to))
out << ch(from);
}
}
int main()
{
in >> (s + 1);
n = strlen(s + 1);
for(int i = n; i >= 1; i--) {
for(int j = 0; j <= 9; j++)
ap1[i][j] = ap1[i + 1][j];
ap1[i][ch(i)] = i;
}
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= 9; j++)
ap2[i][j] = ap2[i - 1][j];
ap2[i][ch(i)] = i;
dp[i][i] = 1;
}
for(int i = 2; i <= n; i++) {
for(int j = i; j <= n; j++) {
int k = j - i + 1;
if(ch(j) == ch(k))
dp[k][j] = dp[k + 1][j - 1] + 2;
else
dp[k][j] = max(dp[k + 1][j], dp[k][j - 1]);
}
}
int from = 1;
int to = n;
for(int i = 1; i <= n; i++) {
if(ch(i) > ch(from))
from = i;
}
for(int i = 10; i >= 1; i--) {
if(dp[from][to] < dp[ap1[1][i]][ap2[n][i]]) {
from = ap1[1][i];
to = ap2[n][i];
}
}
write(from, to);
out << '\n';
in.close();
out.close();
return 0;
}