Pagini recente » Cod sursa (job #335073) | Cod sursa (job #2890872) | Cod sursa (job #321050) | Cod sursa (job #2169890) | Cod sursa (job #1129397)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define SIZE 512
#define SIZE_ALPHA 26
using namespace std;
char s[SIZE];
int len, MAX, chr[SIZE], DP[SIZE_ALPHA + 1][SIZE][SIZE];
int main()
{
freopen("palm.in", "r", stdin);
freopen("palm.out", "w", stdout);
scanf("%s", s);
len = strlen( s + 1 );
for(int i = 0; i <= len; ++i)
{
chr[ i ] = s[ i ] - 'a';
DP[ chr[i] ][ i ][ i ] = 1; // palind munte care incepe pe poz i, se termina pe poz i si incepe cu caracterul chr[i]
}
for(int left = len - 1; left >= 0; --left)
for(int right = left + 1; right <= len; ++right)
{
if( chr[ left ] == chr[ right ])
{
int max_temp = 0;
for( int i = chr[left]; i < SIZE_ALPHA; ++i)
max_temp = max( max_temp, DP[ i ][ left + 1 ][ right - 1]);
DP[ chr[ left ] ][ left ][ right ] = max_temp + 2;
}
for(int i = 0; i < SIZE_ALPHA; ++i)
DP[ i ][ left ][ right ] = max( DP[ i ][ left ][ right ], max ( DP[ i ][ left + 1 ][ right ], DP[ i ][ left ][ right - 1 ] ) );
}
for(int i = 0; i < SIZE_ALPHA; ++i)
MAX = max( MAX, DP[ i ][ 0 ][ len ]);
printf("%d\n", MAX);
return 0;
}