Cod sursa(job #636530)

Utilizator Fetita_JucausaFetita Buclucasa Fetita_Jucausa Data 19 noiembrie 2011 21:04:46
Problema PalM Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.21 kb
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

#define MaxN 500
#define MaxA 26

int bst[MaxN+5][MaxN+5][MaxA+5];
bool viz[MaxN+5][MaxN+5];
char sir[MaxN+5];
int N;

void solve (int i,int j)
{
    if (viz[i][j] || i>j)
        return ;

    viz[i][j]=1;
    if (i==j)
    {
        bst[i][j][sir[i]-'a']=1;
        for (int k='z'-1; k>='a'; --k)
            bst[i][j][k-'a']=max (bst[i][j][k-'a'],bst[i][j][k-'a'+1]);
        return ;
    }
    if (sir[i]==sir[j])
    {
        solve (i+1,j-1);
        bst[i][j][sir[i]-'a']=bst[i+1][j-1][sir[i]-'a']+2;

        for (int k='z'-1; k>='a'; --k)
            bst[i][j][k-'a']=max (bst[i][j][k-'a'],bst[i][j][k-'a'+1]);
        return ;
    }

    solve (i,j-1);
    solve (i+1,j);

    for (int k='z'; k>='a'; --k)
        bst[i][j][k-'a']=max (bst[i+1][j][k-'a'],bst[i][j-1][k-'a']);

    for (int k='z'-1; k>='a'; --k)
        bst[i][j][k-'a']=max (bst[i][j][k-'a'],bst[i][j][k-'a'+1]);
}

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

    fgets (sir,MaxN+5,stdin);
    N=strlen (sir)-1;
    solve (0,N-1);
    printf ("%d",bst[0][N-1][0]);

    return 0;
}