Cod sursa(job #635941)

Utilizator nandoLicker Nandor nando Data 19 noiembrie 2011 15:47:38
Problema PalM Scor 40
Compilator cpp Status done
Runda .com 2011 Marime 1.83 kb
#include <cstdio>
#include <bitset>
#include <iostream>
using namespace std;

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

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][SIGMA];
bitset<MAXN> comp[MAXN];

void f(int i, int j)
{
	if (comp[i][j] || i > j)
		return;
	
//cout << i << " " << j << ": ";		
	comp[i][j] = true;
	
	if (i == j) {
	//	cout << "a" << endl;
		for (int k = 0; k <= SIGMA; ++k) {
			x[i][j][k] = 0;	
		}
		x[i][j][a[i] - 'a'] = 1;
		return;	
	}
	
	if (a[i] == a[j]) {
	//	cout << "b" << endl;
		f(i + 1, j - 1);
		for (int k = 0; k <= SIGMA; ++k) {
			x[i][j][k] = x[i + 1][j - 1][k];	
		}
		
		for (int k = a[i] - 'a'; k <= SIGMA; ++k) {
			x[i][j][a[i] - 'a'] = max(x[i][j][a[i] - 'a'], x[i + 1][j - 1][k] + 2);
		}
		return;
	}	
	//cout << "c" << endl;
	f(i, j - 1);
	f(i + 1, j);
	
	for (int k = 0; k <= SIGMA; ++k) {
		x[i][j][k] = max(x[i][j][k], max(x[i + 1][j][k], x[i][j - 1][k]));
	}
}

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

	while (isalpha(a[len])) {
		++len;	
	}
	
	for (int i = 0; i <= len; ++i) {
		for (int j = i; j <= len; ++j) {
			for (int k = 0; k <= SIGMA; ++k) {
				x[i][j][k] = NONE;
			}
		}	
	}
	
	f(0, len - 1);
	
	int mv = 0;
	for (int i = 0; i <= SIGMA; ++i) {
		mv = max(mv, x[0][len - 1][i]);
	}
	/*
	for (int i = 0; i < len; ++i) {
		for (int j = 0; j < len; ++j) {
			cout << i << " " << j << ":";
			cout << 'a' << " " << x[i][j]['a' - 'a'] << " " << 'b' << " " << x[i][j]['b' - 'a'] << " " << 'x' << " " << x[i][j]['x' - 'a'];
			cout << endl;
		}	
		cout << endl;
	}
	system("pause");*/
	
	fprintf (fout, "%d\n", mv);
	
	fclose(fin);
	fclose(fout);
	return 0;
}