Cod sursa(job #638783)

Utilizator nparfene2004Parfene Narcis nparfene2004 Data 21 noiembrie 2011 16:54:00
Problema PalM Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include<cstring>
#define dim 1001

using namespace std;

int t[dim], lis[dim], poz[dim], n;

int EstePal(int valoare, int st, int dr)
{
	for (int k = dr; k >= st; k--)
		if (valoare == t[k]) return k;
	return -1;
}

int main()
{
	int i, j, x, maxim, p, pf;
	char s[dim];
	
	ifstream fin("palm.in");
	fin >> s;
	fin.close();
	
	n = strlen(s);
	for (i = 1; i <= n; i++)
		t[i] = s[i - 1] - 'a';
	
	t[0] = -1;
	lis[0] = 0;
	poz[0] = n + 1;
	
	for (i = 1; i <= n; i++)
	{
		x = t[i];
		maxim = -1;
		for (j = 0; j < i; j++)
			if (lis[j] != -1)
			{
				p = EstePal(x, i, poz[j] - 1);
				if (t[j] <= x && p != -1 && maxim < lis[j])
				{
					maxim = lis[j];
					pf = p;
				}
			}
		if (maxim == -1)
		{
			lis[i] = -1;
			poz[i] = -1;
		}
		else 
		{ 
			lis[i] = maxim + 1; 
			poz[i] = pf;
		}
	}
	
	// determinare maxim
	maxim = 0;
	for (i = 1; i <= n; i++)
		if (poz[i] == i) lis[i] = 2 * lis[i] - 1;
		else lis[i] = 2 * lis[i] - 1;
	for (i = 1; i <= n; i++)	
		if (maxim < lis[i]) 
			maxim = lis[i];

	ofstream fout("palm.out");
	fout << maxim;
	fout.close();
	
	return 0;
}