Cod sursa(job #637037)

Utilizator Teodor94Teodor Plop Teodor94 Data 20 noiembrie 2011 10:42:19
Problema PalM Scor 30
Compilator cpp Status done
Runda .com 2011 Marime 1.09 kb
#include<cstdio>
#include<cstring>

const int N = 502;
const int K = 28;

int n, d[N][N][K];
char s[N];

inline int max(int x, int y) {
    return x > y ? x : y;
}

void rez() {
    for (int i = 0; i <= n; ++i)
        d[i][i][s[i] - 'a'] = 1;

    for (int i = n - 1; i >= 0; --i)
        for (int j = i + 1; j <= n; ++j)
            if (s[i] == s[j])
                for (int k = s[i] - 'a'; k < 26; ++k)
                    d[i][j][s[i] - 'a'] = max(d[i][j][s[i] - 'a'], d[i + 1][j - 1][k] + 2);
            else
                for (int k = s[i] - 'a'; k < 26; ++k) {
                    d[i][j][s[i] - 'a'] = max(d[i][j][s[i] - 'a'], d[i][j - 1][k]);
                    if (i > 0)
                        d[i][j][s[i] - 'a'] = max(d[i][j][s[i] - 'a'], d[i - 1][j][k]);
                }

    int lgmax = 0;

    for (int i = 0; i <= n; ++i)
        for (int k = 0; k < 26; ++k)
            lgmax = max(lgmax, d[i][n][k]);

    printf("%d\n", lgmax);
}

int main() {
    freopen("palm.in", "r", stdin);
    freopen("palm.out", "w", stdout);

    gets(s);
    n = strlen(s) - 1;

    rez();

    return 0;
}