Cod sursa(job #1482996)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 8 septembrie 2015 14:40:07
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 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;
}