Cod sursa(job #874275)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 8 februarie 2013 02:42:33
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
using namespace std;
#define LE 666
int DP[3][LE][29];
ifstream f ( "palm.in" );
ofstream g ( "palm.out" );
#define inf 1<<26
int i, j, t;
string s;
int len, A[LE];

int main()
{
    f >> s;
    int N = s.length();

    for ( i = 0; i < N; ++i )
    {
        A[i+1] = s[i] - 'a';

        for ( j = A[i+1]; j >= 0; --j ) DP[1][i+1][j] = 1;
    }

    for ( len = 1; len <= N; ++len )
    {
        for ( j = 1; j + len <= N; ++j )
        {
            if ( A[j] == A[j+len] )
                DP[2][j][A[j]] = max ( DP[2][j][A[j]], DP[0][j+1][A[j]] + 2 );

            for ( t = 26; t >= 0; --t )
            {
                DP[2][j][t] = max ( DP[2][j][t], max ( DP[1][j][t], DP[1][j+1][t] ) );
                DP[2][j][t] = max ( DP[2][j][t], DP[2][j][t+1] );
            }
        }

        for ( j = 1; j <= N; ++j )
            for ( t = 0; t <= 26; ++t )
            {
                int AA = DP[1][j][t];
                DP[1][j][t] = DP[2][j][t];
                DP[0][j][t] = AA;
                DP[2][j][t] = -inf;
            }
    }

    g << max(DP[1][1][0],DP[0][1][0]) << '\n';

    f.close();
    g.close();
    return 0;
}