Cod sursa(job #635456)

Utilizator nandoLicker Nandor nando Data 19 noiembrie 2011 11:49:32
Problema PalM Scor 20
Compilator cpp Status done
Runda .com 2011 Marime 1.25 kb
#include <cstdio>
#include <iostream>
using namespace std;

#define MAXN 550
#define INF 0x3f3f3f3f
#define NONE -10000

inline int max(int a, int b)
{
	return a > b ? a : b;	
}

FILE* fin = fopen("palm.in", "r");
FILE* fout = fopen("palm.out", "w");

char a[MAXN];
int len = 0, x[MAXN][MAXN], prev[MAXN][MAXN];

int f(int i, int j)
{
	if (x[i][j] == NONE) {		
		if (i == j) {
			x[i][j] = 1;	
			prev[i][j] = a[i];
		} else if (i == j - 1) {
			x[i][j] = (a[i] == a[j]) ? 2 : 1;	
			prev[i][j] = a[i];
		} else if (a[i] == a[j]) {
			int k = f(i + 1, j - 1);
			
			if (prev[i + 1][j - 1] >= a[i]) {
				x[i][j] = k + 2;	
				prev[i][j] = a[i];				
			} else {
				x[i][j] = k;
				prev[i][j] = prev[i + 1][j - 1];	
			}
		} else {
			int a = f(i, j - 1), b = f(i + 1, j);
			
			if (a > b) {
				x[i][j] = a;
				prev[i][j] = prev[i][j - 1];
			} else {
				x[i][j] = b;
				prev[i][j] = prev[i + 1][j];	
			}
		}
	}
	
	return x[i][j];
}

int main()
{
	fgets(a, sizeof(a), fin);

	while (isalpha(a[len])) {
		++len;	
	}
	
	for (int i = 0; i <= len; ++i) {
		for (int j = 0; j <= len; ++j) {
			x[i][j] = NONE;
		}	
	}
	
	fprintf (fout, "%d\n", f(0, len));
	
	fclose(fin);
	fclose(fout);
	return 0;
}