Cod sursa(job #22628)

Utilizator rusRus Sergiu rus Data 26 februarie 2007 22:53:18
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#define dim 5001

int a[dim],t[dim],l[dim],b[dim];
int nr;
int n;
int k;
void citire();
int dinamica();
void afis(int );
void afis(int );
void solve();
int main()
{
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);

	citire();
	k=dinamica();
	//printf("%d ",k);
	afis(k);
	solve();
	return 0;
}
void citire()
{
	scanf("%d",&n);
	int i;
	for(i=1;i<=n;i++)
	 scanf("%d",&a[i]);

}
int dinamica()
{
	int i,j,max,k;

	for(i=1;i<=n;i++)
	{
		max=1;
		t[i]=0;
		for(j=1;j<i;j++)
		if(a[j]<a[i] && l[j]+1>max)
		{
			max=l[j]+1;
			t[i]=j;
		}
		l[i]=max;
	}

       max=0;

       for(i=1;i<=n;i++)
       if(l[i]>max)
       {
		max=l[i];
		k=i;
       }
       return k;

}
void afis(int i)
{
	if(i==0) return ;
	afis(t[i]);
	b[++nr]=a[i];
}
void solve()
{
	int i,sol=0,j,poz;
	for(i=1;i<=n;i++)
	{
	   for(j=1;j<=nr;j++)
	     if(a[i]==b[j])
	     sol++;
	}
	if(sol!=n)
	printf("-1");
	else
	{

		for(i=1;i<=n;i++)
		{
		if(a[i]==b[1])
		break;
                }
		poz=i;
		printf("%d",k-poz+1);

		//printf("%d ",poz);
	}
}