Cod sursa(job #640080)

Utilizator mottyMatei-Dan Epure motty Data 24 noiembrie 2011 18:49:54
Problema PalM Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define dr (st+d)
#define ALPH ('z'-'a')

using namespace std;

const int N = 505;
const int K = 27;

int n;
int v[N][N][K];

char c[N];

inline int alph(char x) {
	return x - 'a';
}

inline int mx(int a, int b) {
	return (a<b ? b:a);
}

inline int mx(int a, int b, int c) {
	b = mx(b, c);
	return mx(a, b);
}

void PrepareMatrix() {
	for (int i = 1; i <= n; ++i)
		v[i][i][c[i]-'a'] = 1;
}

int Solve()
{
	PrepareMatrix();

	int res = 0;

	for (int d = 1; d < n; ++d) //Distanta dintre st si dr
		for (int st = 1; st + d <= n; ++st)
		{
			if (c[st] == c[dr])
				for (int k = alph(c[st]); k <= ALPH; ++k)
					v[st][dr][alph(c[st])] = mx(v[st][dr][alph(c[st])], v[st+1][dr-1][k] + 2);

			for (int k = 0; k <= ALPH; ++k)
			{
				int a = v[st+1][dr-1][k];
				int b = v[st+1][dr][k];
				int c = v[st][dr+1][k];
			
				v[st][dr][k] = mx(v[st][dr][k], mx(a, b, c));

				res = mx(res, v[st][dr][k]);
			}
		}

	return res;
}

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

	gets(c+1);
	n = strlen(c+1);

	int res = Solve();
	printf("%d\n", res);

	return 0;
}