Cod sursa(job #638508)

Utilizator SpiderManSimoiu Robert SpiderMan Data 20 noiembrie 2011 21:55:51
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
# include <cstdio>
# include <cstring>

const char *FIN = "palm.in", *FOU = "palm.out";
const int MAX_N = 505, MAX_K = 30;

char S[MAX_N];
int N, dp[MAX_N][MAX_N][MAX_K];
bool viz[MAX_N][MAX_N];

inline int c (char ch) {
    return ch - 'a';
}

inline int max (int a, int b) {
    return a > b ? a : b;
}

inline void getmax (int &a, int b) {
    a = a > b ? a : b;
}

void doit (int x, int y) {
    if (viz[x][y] || x > y) return ;
    viz[x][y] = 1;
    if (x == y) {
        dp[x][y][c(S[x])] = 1;
        for (int ch = 'z' - 1; ch >= 'a'; --ch)
            getmax (dp[x][y][c(ch)], dp[x][y][c(ch) + 1]);
        return ;
    }
    if (S[x] == S[y]) {
        doit (x + 1, y - 1);
        dp[x][y][c(S[x])] = dp[x + 1][y - 1][c(S[x])] + 2;
        for (int ch = 'z' - 1; ch >= 'a'; --ch)
            getmax (dp[x][y][c(ch)], dp[x][y][c(ch) + 1]);
        return ;
    }
    doit (x, y - 1), doit (x + 1, y);
    for (int ch = 'z'; ch >= 'a'; --ch)
        dp[x][y][c(ch)] = max (dp[x + 1][y][c(ch)], dp[x][y - 1][c(ch)]);
    for (int ch = 'z' - 1; ch >= 'a'; --ch)
            getmax (dp[x][y][c(ch)], dp[x][y][c(ch) + 1]);
}

int main (void) {
    fscanf (fopen (FIN, "r"), "%s", S);
    N = strlen (S);
    doit (0, N - 1);
    fprintf (fopen (FOU, "w"), "%d", dp[0][N - 1][0]);
}