Cod sursa(job #658281)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 8 ianuarie 2012 14:58:39
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>
#include <string>

#define MAXN 502

using namespace std;

int N;
char s[MAXN+ 5];
int S[MAXN];
int dp[27][MAXN][MAXN];

int main() {

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


	gets(s + 1);
	N = strlen(s + 1);
	for(int i = 1; i <= N; i++)
		S[i] = (s[i] - 'a');

	for(int i = 1; i <= N; i++) {
		dp[S[i]][i][i] = 1;
	}
//	return 0;
	for(int i = N; i >= 1; i--) {
		for(int j = i + 1; j <= N; j++) {
			int st, dr;
			st = i; dr = j;
			if(S[st] == S[dr]) {
				int mx = 0;
				
				for(int k = S[st]; k < 26; k++)
					mx = max(mx, dp[k][st + 1][dr - 1]);
				dp[S[st]][st][dr] = mx + 2;

			}
			for(int k = 0; k < 26; k++)
				dp[k][st][dr] = max(max(dp[k][st][dr], dp[k][st + 1][dr]), dp[k][st][dr - 1]);
			
		}
	}
/*
	for(int k = 0; k < 26; k++) {
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= N; j++)
				printf("%d ", dp[k][i][j]);
			printf("\n");
		}
		printf("\n");
	}
*/
	int mx = 0, lit = 0;
	for(int k = 0; k < 26; k++) 
		if(mx < dp[k][1][N]) {
			mx = dp[k][1][N];
			lit = k;
		}
//	printf("%d\n", dp[0][3][5]);
	printf("%d\n", mx);
	return 0;
}