Cod sursa(job #637757)

Utilizator irene_mFMI Irina Iancu irene_m Data 20 noiembrie 2011 16:25:42
Problema PalM Scor 70
Compilator cpp Status done
Runda .com 2011 Marime 1.52 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

const int MAX_N = 505;

int N, lg[ MAX_N ][ MAX_N ];
char sir[ MAX_N ];

int gaseste( int i, int j, int &l1, int &l2 ){

    int MAX = 0, st, dr;

    l1 = l2 = -1;

    for( st = i + 1; st < j; ++st )
        for( dr = j - 1; dr >= st; --dr )
            if( sir[ st ] == sir[ dr ] && sir[ i ] <= sir[ st ] && lg[ st ][ dr ] > MAX )
                MAX = lg[ st ][ dr ], l1 = st, l2 = dr;
    if( l1 == -1 )
        return 0;
    return 1;
}

int maxim( int a, int b ){
    if( a > b )
        return a;
    return b;
}

void dinamic(){
    int i, j, l1, l2, l;

    N = strlen( sir );

    for( i = 0; i < N; ++i )
        lg[ i ][ i ] = 1;

    for( l = 1; l < N; ++l )
        for( i = 0; i < N - l; ++i )
        {
            j = i + l;
            if( sir[ i ] != sir[ j ] )
                lg[ i ][ j ] = maxim( lg[ i ][ j - 1 ], lg[ i + 1 ][ j ] );
            else{
                if( gaseste( i, j, l1, l2 ) )
                    lg[ i ][ j ] = lg[ l1 ][ l2 ] + 2;
                else
                    lg[ i ][ j ] = 2;
            }
        }
}

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

    scanf( "%s", sir );
    dinamic();
    printf( "%d\n", lg[ 0 ][ N - 1 ] );

    /*for( int i = 0; i < N; ++i ){
        for(int j = 0; j<N; ++j )
            printf("%d ",lg[i][j]);
        printf("\n");
    }*/

    fclose( stdin );
    fclose( stdout );
    return 0;
}