Cod sursa(job #2033516)

Utilizator giotoPopescu Ioan gioto Data 6 octombrie 2017 21:59:55
Problema Elimin 2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#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;
}