Pagini recente » Cod sursa (job #1791782) | Cod sursa (job #3219842) | Cod sursa (job #2548486) | Cod sursa (job #415561) | Cod sursa (job #637757)
Cod sursa(job #637757)
#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;
}