Cod sursa(job #636410)

Utilizator darkseekerBoaca Cosmin darkseeker Data 19 noiembrie 2011 19:45:36
Problema PalM Scor 20
Compilator cpp Status done
Runda .com 2011 Marime 2.26 kb
#include <fstream>
#include <cstring>
#define NMAX 505
#define in "palm.in"
#define out "palm.out"
using namespace std;

bool viz[257];
char sir[NMAX];
int a[NMAX][NMAX];
int maxim = 0,lg;
int dp[NMAX],start[NMAX],ct[NMAX],ctStart[NMAX];

ifstream fin(in);
ofstream fout(out);

inline int max(int a,int b)
{
	return (a>b)?a:b;
}

void compute(int poz)
{
	int i;
	for(i = 0; i <= 256; i++)
		viz[i] = 0;
	
	for(i = 0; i < poz; i++)
		if(!viz[int(sir[i])])
		{
			viz[int(sir[i])] = 1;
			a[poz][int(sir[i])] = i;
		}
	
	for(i = poz - 1; i >= 0; i--)
		if(sir[i] > sir[poz] && a[i][int(sir[poz])] != 999)
		{
			dp[poz] = 3;
			if(start[poz] < a[i][int(sir[poz])])
				start[poz] = a[i][int(sir[poz])];
		}
			
}

int main()
{
	fin.get(sir,NMAX,'\n');
	fin.get();
	
	lg = strlen(sir);
	
	int i = 0,j;
	
	for(i = 0; i < 501; i++)
		for(j = 0; j < 501; j++)
			a[i][j] = 999;
		
	for(i = 0; i < 501; i++)
		start[i] = 999,ct[i] = 1,ctStart[i] = i;
	
	dp[0] = 0;
	
	if(sir[1] == sir[0])
		{
			ct[1] = 2;
			ctStart[1] = 0;
		}
	else
		ct[1] = 1, ctStart[1] = 1;
			
	
	for(i = 0; i < lg; i++)
		compute(i);
	
	for(i = 2; i < lg; i++)
		for(j = i - 1; j >= 0; j--)
		{
			if(sir[j] > sir[i] && ctStart[j] != 999)
				{					
					if(a[ctStart[j]][int(sir[i])] != 999)
					{
						if(ct[j] + 2 > dp[i])
						{
							dp[i] = ct[j] + 2;
							start[i] = a[ctStart[j]][int(sir[i])];
						}
						if(ct[j] + 2 == dp[i])
							if(a[ctStart[j]][int(sir[i])] < start[i])
								start[i] = a[ctStart[j]][int(sir[i])];
					}
				}
			
			if(sir[j] == sir[i])
				{
					if(ct[j] >= ct[i])
					{
						ctStart[i] = ctStart[j];
						ct[i] = ct[j] + 1;
					}
				}
			
			if(sir[j] >= sir[i] && start[j] != 999)
				if(a[start[j]][int(sir[i])] != 999)				
					{
						if(dp[j] + 2 > dp[i])
							{
								dp[i] = dp[j] + 2;
								start[i] = a[start[j]][int(sir[i])];
							}
						if(dp[j] + 2 == dp[i])
							if(a[start[j]][int(sir[i])] < start[i])
								start[i] = a[start[j]][int(sir[i])];
					}
		}
		
	for(i = 0; i < lg; i++)
		{
			if(dp[i] > maxim)
				maxim = dp[i];
			if(ct[i] > maxim)
				maxim = ct[i];
		}

	fout<<maxim<<'\n';
	fin.close();
	fout.close();
	return 0;
}