Cod sursa(job #712417)

Utilizator danalex97Dan H Alexandru danalex97 Data 13 martie 2012 14:03:01
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.99 kb
/* 

#include <cstring>
#include <fstream>

#define Sigma 27
#define Lmax 511

#define maxim(a , b) ( ( a>b ) ? a : b )

using namespace std;
ifstream fin("palm.in");
ofstream fout("palm.out");

char A[Lmax];
int N, maxP[Lmax][Lmax][Sigma];
char Inf[Lmax][Lmax][Sigma],Sup[Lmax][Lmax][Sigma];

void SHL()
{
	for (int i=N;i>=0;--i)
		A[i+1]=A[i];
	++N;
}

void Read()
{
	fin >> A;
	N = strlen(A)-1;
}

void Build_1(int i,int j)
{
	++maxP[i][j][0];
	for (int j2=1;j2<=maxP[i][j+1][0];++j2)
		if ( maxP[i][j][maxP[i][j+1][j2]] > maxP[i][j][maxP[i][j][0]] )
		{
			maxP[i][j][maxP[i][j][0]]=maxP[i][j+1][maxP[i][j+1][j2]];
			Inf[i][j][maxP[i][j][0]]=Inf[i][j+1][maxP[i][j+1][j2]];
			Sup[i][j][maxP[i][j][0]]=Sup[i][j+1][maxP[i][j+1][j2]];
		}
	for (int j2=1;j2<=maxP[i+1][j][0];++j2)
		if ( maxP[i][j][maxP[i+1][j][j2]] > maxP[i][j][maxP[i][j][0]] )
		{
			maxP[i][j][maxP[i][j][0]]=maxP[i+1][j][maxP[i+1][j][j2]];
			Inf[i][j][maxP[i][j][0]]=Inf[i+1][j][maxP[i+1][j][j2]];
			Sup[i][j][maxP[i][j][0]]=Sup[i+1][j][maxP[i+1][j][j2]];
		}
}

void Build_2(int i,int j)
{
	for (int j2=1;j2<=maxP[i+1][j+1][0];++j2)
		if (A[i]<Sup[i+1][j+1][j2])
		{
			maxP[i][j][++maxP[i][j][0]]=maxP[i+1][j+1][j2]+2;
			Inf[i][j][maxP[i][j][0]]=Inf[i+1][j+1][j2];
			Sup[i][j][maxP[i][j][0]]=Sup[i+1][j+1][j2];
		}
	for (int j2=1;j2<=maxP[i][j+1][0];++j2)
		if (A[i]==Sup[i][j+1][j2])
		{
			maxP[i][j][++maxP[i][j][0]]=maxP[i+1][j+1][j2]+1;
			Inf[i][j][maxP[i][j][0]]=Inf[i+1][j+1][j2];
			Sup[i][j][maxP[i][j][0]]=Sup[i+1][j+1][j2];
		}
	if (maxP[i][j][0]==0)
		Build_1(i,j);
}

void Write()
{
	int Max=0;
	for (int i=1;i<=maxP[N][N][0];++i)
		Max=maxim(maxP[N][N][i],Max);
	
	fout<<Max<<'\n';
	
	fin.close();
	fout.close();
}

int main()
{	
	Read();
	SHL();
	
	for (int i=1;i<=N;++i)
	{
		maxP[i][i][1]=1;
		Inf[i][i][1]=A[i];
		Sup[i][i][1]=A[i];
		maxP[i][i][0]=1;
	}
	
	for (int i=1;i<=N;++i)
		for (int j=i+1;j<=N;++j)
			if (A[i]!=A[j])
				Build_1(i,j);
			else
				Build_2(i,j);
	
	Write();
	
	return 0;
}

*/

// SURSA I (viteza mai mare)

#include <cstring>
#include <fstream>

using namespace std;

char A[506];
int N, maxP[502][502][26];

int main()
{
	ifstream fin("palm.in");
	ofstream fout("palm.out");
	
	fin >> A;
	N = strlen(A);
	
	for (int i = 1; i <= N; ++i)
		for (int j = 0; j <= A[i - 1] - 'a'; ++j)
			maxP[i][i][j] = 1;
	for (int i = 2; i <= N; ++i) // marimea
		for (int j = 1; j <= N - i + 1; ++j)
		{
			for (int k = 0; k <= 26; ++k)
				maxP[j][j + i - 1][k] = max(maxP[j][j + i - 2][k], maxP[j + 1][j + i - 1][k]);
			if (A[j - 1] == A[j + i - 2])
				for (int k = 0; k <= A[j - 1] - 'a'; ++k)
				{
					if (i > 2)
						maxP[j][j + i - 1][k] = max(maxP[j][j + i - 1][k], maxP[j + 1][j + i - 2][A[j - 1] - 'a'] + 2);
					else
						maxP[j][j + i - 1][k] = max(maxP[j][j + i - 1][k], 2);
				}
		}
	
	fout << maxP[1][N][0];
	
	fin.close();
	fout.close();
}

// SURSA II - implementare usoara