Cod sursa(job #516165)

Utilizator ms-ninjacristescu liviu ms-ninja Data 23 decembrie 2010 12:27:44
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <algorithm>
using namespace std;
#define dim 5001
int v[dim],a[dim],b[dim],best[dim],dap[dim];

int main()
{
	ifstream fin("secv.in");
	ofstream fout("secv.out");
	int i, n,m=1,j,maxim=1;
	fin>>n;
	
	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;
	best[1]=1;
	for(i=2;i<=n;++i)
	{
		for(j=i-1;j>=0;--j)
			if(v[i]>v[j])
				if(best[j]+1>best[i])
					best[i]=best[j]+1;
		
		if(maxim<best[i])
			maxim=best[i];
		
	}
	if(maxim!=m)
		fout<<"1";
	else
	{
		int f,contor,lung=dim,lulu,mare,aux;
		for(i=n;i>=1;--i)
		{
			aux=maxim;
			lulu=i;
			contor=f=0;
			
			while(aux>0 && i>0)
			{
				if(best[i]==aux)
					--aux;
			++contor;
			--i;
			}
				
		
			if(contor<lung)
			{
				mare=1;
				lung=contor;
				aux=maxim;
				for(j=lulu;j>=i+1;--j)
				{
					if(best[j]==aux)
					{
						dap[mare]=v[j];
						++mare;
						--aux;
					}
				}
			}
			
		}
		--mare;
		sort(dap+1,dap+mare+1);
		
		int ok=1;
		
		for(j=1;j<=n;++j)
			if(b[j]!=dap[j])
				ok=0;
			
			if(ok==0)
				fout<<lung;
			else
				fout<<lung;
	}
	
	return 0;
}