Cod sursa(job #181888)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 19 aprilie 2008 09:47:24
Problema Secv Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define N 5010
int v[N],lung[N],pred[N];
int n,nr,best=INT_MAX;
void scan(){
	int i,j,sw;
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;++i){
		scanf("%d",&v[i]);
		sw=1;
		for (j=1;j<i && sw==1;++j)
			if(v[j]==v[i])
				sw=0;
		if (sw==1)
			++nr;
	}
}
void subsir(){
	int i,j;
	lung[1]=1;pred[1]=-1;
	for (i=2;i<=n;++i){
		pred[i]=-1;lung[i]=1;
		for (j=1;j<i;++j)
			if (v[j]<v[i] && lung[j]>=lung[i]-1){
                lung[i]=lung[j]+1;
                pred[i]=j;
			}
	}
}
int predecesor(int x){
    if (pred[x]!=-1)
       return predecesor(pred[x]);
    else
        return x;
}
void print(){
	int max=0,i,x;
	for (i=1;i<=n;++i){
		x=predecesor(i);
		if (lung[i]>=max){
			if (lung[i]==max){
				if (i-x+1<best){
					best=i-x+1;
					max=lung[i];
				}
			}
			else if (lung[i]>max){
				max=lung[i];
				best=i-x+1;
			}
		}		
	}
	if (max!=nr){
		printf("-1\n");
		exit(0);
	}
	printf("%d\n",best);
	fclose(stdin);
    fclose(stdout);
    exit(0);
}
int main(){
    scan();
    subsir();
    print();
}