Cod sursa(job #531177)

Utilizator razyelxrazyelx razyelx Data 9 februarie 2011 02:20:11
Problema Subsir 2 Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream.h>
#define N 5001
ifstream fin("subsir2.in");
ofstream fout("subsir2.out");
long long a[N], n, p[N], L[N], min, idxMin,best,start;
void scmax(){

	int i,j;
	
	best = 5001;
	
	for (i=n; i>0; i--){
		
		L[i] = 1; // lungimea sirului maximal i 
		p[i] = i; // urmatorul element dupa i
		min = 5001;
		idxMin = 5001;
		
		for (j=i+1; j<=n; j++){
						
			if(a[i] <= a[j] && L[j]+1<min){
				
				L[i] = L[j] + 1;
				p[i] = j;
				
				min = L[j];
				idxMin = j;
			}
			
			if (a[i] <= a[j] && L[j]+1 == min){
				if (a[j] < a[idxMin]){
					p[i] = j;
					idxMin = j;
				}
			}
		}
		
		if ( L[i] < best || (L[i] == best && a[i]<a[start])){
			best = L[i];
			start = i;
		} 
	}
	
}

int find_sol(){
	int max = -1, k;
	
	for (int i=1;i<=n;i++)
		if (L[i] >= max){max = L[i]; k = i;}
		
	return k;	
}


int main(){
	long i,j,k;
	
	fin>>n;
	for (i=1;i<=n; i++)
		fin>>a[i];
	
	scmax();
	k = find_sol();
	
	fout<<L[k]<<"\n";
	
		
	j = start;
	while(j != p[j]){
		//fout<<a[j]<<" ";
		j = p[j];
	}
		
	return 0;
}