Cod sursa(job #636541)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 19 noiembrie 2011 21:08:09
Problema PalM Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 0.95 kb
#include <stdio.h>
#define NMAX 505
#define sigma 26
char A[NMAX];
int n,rez;
short int B[NMAX][NMAX][26];
inline int lit(char x)
{
	return x>='a' && x<='z';
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
int main()
{
	freopen("palm.in","r",stdin);
	freopen("palm.out","w",stdout);
	fgets(A+1,NMAX,stdin);
	while (lit(A[n+1])) n++;
	fgets(A+1,NMAX,stdin);
	int i,j,k,st,dr;
	for (i=1; i<=n; i++)
		B[i][i][A[i]-'a']=1;
	for (i=2; i<=n; i++)
	{
		for (j=1; j<=n-i+1; j++)
		{
			st=j; dr=j+i-1;
			if (A[st]==A[dr])
			{
				B[st][dr][A[st]-'a']=2;
				if (st+1<=dr-1)
				{
					for (k=A[st]-'a'; k<26; k++)
						B[st][dr][A[st]-'a']=max(B[st][dr][A[st]-'a'],2+B[st+1][dr-1][k]);
				}
			}
			for (k=0; k<26; k++)
			{
				B[st][dr][k]=max(B[st][dr][k],B[st+1][dr][k]);
				B[st][dr][k]=max(B[st][dr][k],B[st][dr-1][k]);
				if (B[st][dr][k]>rez)
					rez=B[st][dr][k];
			}
		}
	}
	printf("%d\n",rez);
	return 0;
}