Cod sursa(job #520431)

Utilizator ms-ninjacristescu liviu ms-ninja Data 8 ianuarie 2011 16:07:58
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <algorithm>
using namespace std;
#define dim 5001
int v[dim],a[dim],b[dim],best[dim],q[dim];

int main()
{
	ifstream fin("secv.in");
	ofstream fout("secv.out");
	int i, n,m=1,j,maxim=1;
	fin>>n;

	if(n==0)
	{
			fout<<"1";
			return 0;
	}
		
	for(i=1;i<=n;++i)
	{
		fin>>v[i];
		a[i]=v[i];
	}
	sort(a+1,a+n+1);
	
	for(i=1;i<=n;++i)
	{
		while(a[i]==a[i+1])
			++i;
		b[m]=a[i];
		++m;
	}
	--m;
	for(i=1;i<=n;++i)
		best[i]=1;
	
	for(i=2;i<=n;++i)
	{

		for(j=i-1;j>=1;--j)
		{
			if(v[i]>v[j])
			{
				if(best[j]+1>best[i])
					best[i]=best[j]+1;
			}
			else
				if(v[i]==v[j])
					{
						if(best[j]>best[i])
						best[i]=best[j];
					}
			
		}
	
		if(maxim<best[i])
			maxim=best[i];
	}
	
	int chiul=1;
	for(i=1;i<=n;++i)
		if(best[i]==maxim)
		{
			q[chiul]=i;
			++chiul;
		}
	
	
	if(maxim!=m)
	{
		fout<<"1";
		return 0;
	}
	
	
		int contor,lung=dim,lulu,mare,aux;
		for(i=n;i>=1;--i)
		{
			
			while((v[i]==v[i-1] || best[i]!=maxim) && i>0)
				--i;
			aux=maxim;
			lulu=i;
			contor=0;
			int valid=0;
			while(aux>0 && lulu>0)
			{
				if(best[lulu]==aux)
					--aux;
			++contor;
			--lulu;
			valid=1;
			}
				
		
			if(contor<lung && valid==1)
			{
				mare=1;
				lung=contor;
				aux=maxim;
				for(j=lulu;j>=i+1;--j)
				{
					if(best[j]==aux)
					{
						a[mare]=v[j];
						++mare;
						--aux;
					}
				}
			}
		
		}
		--mare;
		sort(a+1,a+mare+1);
		
		int ok=1;
		
		
		if(ok==0)
				fout<<"1";
			else
			fout<<lung;
	
	
	
	return 0;
}