Cod sursa(job #638317)

Utilizator klamathixMihai Calancea klamathix Data 20 noiembrie 2011 20:13:47
Problema PalM Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.06 kb
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 505;

int i , j , k , n , dp[maxn][maxn][30] , ans;
char A[maxn];

int main()
{
	freopen("palm.in","r",stdin);
	freopen("palm.out","w",stdout);
	
	scanf("%s",&A);
	
	for ( n = 0 ; A[n] >= 'a' && A[n] <= 'z' ; ++n );
	
	for ( i = 0 ; i < n ; ++i ) {
		dp[i][i][ A[i] - 'a'] = 1;
		//if ( i + 1 < n && A[i] == A[i + 1])
			//dp[i][i + 1] = 1;
	}
	
	for ( j = 1 ; j < n ; ++j ) 
		for ( i = 0 ; i < n ; ++i ) {
			
			if ( i + j >= n ) continue;
			
			for ( k = 0 ; k <= 'z' - 'a' ; ++k )
				dp[i][i + j][k] = max ( dp[i + 1][i + j][k] , dp[i][i + j - 1][k]);
			
			if ( A[i] == A[i + j] ) {
				int t = 0;
				for ( k = A[i] - 'a' ; k <= 'z' - 'a' ; ++k )
					t = max ( t , dp[i + 1][i + j - 1][k] );
				dp[i][i + j][ A[i] - 'a'] = max ( dp[i][i + j][A[i] - 'a'] , t + 2);
			}
		}
	
	for ( i = 0 ; i < n ; ++i )
		for ( j = i ; j < n ; ++j ) 
			for ( k = 'a' ; k <= 'z' ; ++k )
		ans = max ( ans , dp[i][j][k - 'a']);
	
	printf("%d\n",ans);
	
return 0;
}