Pagini recente » Cod sursa (job #2350883) | Cod sursa (job #1143341) | Cod sursa (job #2232684) | Cod sursa (job #1288033) | Cod sursa (job #2938898)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
string str;
short dp[2005][2005];
int Next[105][2005], Prev[105][2005];
void build(int st, int dr, int lung) { // afisare rezultat
if(st <= dr) {
for(int i = 9; i >= 0; i--) {
if(dp[Next[i][st]][Prev[i][dr]] != lung) {
continue;
}
fout << i;
build(Next[i][st] + 1, Prev[i][dr] - 1, lung - 2);
if(lung >= 2) {
fout << i;
}
return;
}
}
}
int main() {
fin >> str;
int n = str.length();
str = "#" + str;
for(int i = 1; i <= n; i++) {
dp[i][i] = 1;
}
for(int j = 0; j < 100; j++) {
Next[j][n + 1] = n + 1;
}
for(int i = n; i >= 1; i--) {
for(int j = 0; j < 10; j++) {
Next[j][i] = Next[j][i + 1];
}
Next[str[i] - '0'][i] = i;
}
for(int i = 1; i <= n; i++) {
for(int j = 0; j < 10; j++) {
Prev[j][i] = Prev[j][i - 1];
}
Prev[str[i] - '0'][i] = i;
}
for(int l = 2; l <= n; l++) {
for(int i = 1, j = l; j <= n; i++, j++) {
if(str[i] == str[j]) {
dp[i][j] = 2 + dp[i + 1][j - 1];
} else {
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
int lung = 0;
for(int i = 1; i < 10; i++) {
lung = max(lung, (int) dp[Next[i][1]][Prev[i][n]]);
}
build(1, n, lung);
return 0;
}