Pagini recente » Cod sursa (job #567809) | Cod sursa (job #2448654) | Cod sursa (job #618589) | Cod sursa (job #15583) | Cod sursa (job #2033515)
#include <bits/stdc++.h>
using namespace std;
int n;
struct dinamica{
int x, Last, ok;
bool operator < (const dinamica aux) const{
return x < aux.x;
}
};
dinamica d[2005][2005], d0[2005][2005];
char s[2005], sol[2005];
int main()
{
// freopen("elimin2.in", "r", stdin);
// freopen("elimin2.out", "w", stdout);
scanf("%s", s + 1);
n = strlen(s + 1);
for(int i = 1; i <= n ; ++i) d[i][i].x = 1;
for(int k = 1; k < n ; ++k){
for(int i = 1; i + k <= n ; ++i){
int j = i + k;
d0[i][j].x = d[i][j - 1].x;
d0[i][j].ok = 0; d[i][j].Last = 2;
if(s[i] == s[j]) {
if(d0[i][j].x < d[i + 1][j - 1].x + 2){
d0[i][j].x = d[i + 1][j - 1].x + 2;
d0[i][j].ok = 0; d0[i][j].Last = 3;
}
if(d0[i][j].x < d0[i + 1][j - 1].x + 2){
d0[i][j].x = d0[i + 1][j - 1].x + 2;
d0[i][j].ok = 1; d0[i][j].Last = 3;
}
}
if(d0[i][j] < d[i + 1][j]){
d0[i][j].x = d[i + 1][j].x;
d0[i][j].ok = 0; d0[i][j].Last = 1;
}
if(d0[i][j] < d0[i + 1][j]){
d0[i][j].x = d0[i + 1][j].x;
d0[i][j].ok = 1; d0[i][j].Last = 1;
}
if(d0[i][j] < d0[i][j - 1]){
d0[i][j].x = d0[i][j - 1].x;
d0[i][j].ok = 1; d0[i][j].Last = 2;
}
if(s[i] != '0'){
d[i][j].x = d[i][j - 1].x;
d[i][j].ok = 0; d[i][j].Last = 2;
if(s[i] == s[j]) {
if(d[i][j].x < d[i + 1][j - 1].x + 2){
d[i][j].x = d[i + 1][j - 1].x + 2;
d[i][j].ok = 0; d[i][j].Last = 3;
}
if(d[i][j].x < d0[i + 1][j - 1].x + 2){
d[i][j].x = d0[i + 1][j - 1].x + 2;
d[i][j].ok = 1; d[i][j].Last = 3;
}
}
if(d[i][j] < d[i + 1][j]){
d[i][j].x = d[i + 1][j].x;
d[i][j].ok = 0; d[i][j].Last = 1;
}
if(d[i][j] < d0[i + 1][j]){
d[i][j].x = d0[i + 1][j].x;
d[i][j].ok = 1; d[i][j].Last = 1;
}
if(d[i][j] < d0[i][j - 1]){
d[i][j].x = d0[i][j - 1].x;
d[i][j].ok = 1; d[i][j].Last = 2;
}
}
}
}
int st = 1, dr = n, ok = 0, nr, l = 1, r = d[1][n].x;
while(st <= dr){
if(ok == 0) nr = d[st][dr].Last, ok = d[st][dr].ok;
else nr = d0[st][dr].Last, ok = d0[st][dr].ok;
if(nr == 0) break;
if(nr == 1) ++st;
else if(nr == 2) --dr;
else sol[l++] = s[st++], sol[r--] = s[dr--];
}
if(st == dr) sol[l] = s[st];
printf("%s", sol + 1);
return 0;
}