Cod sursa(job #1129437)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 februarie 2014 22:13:26
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

#define INF 0x3f3f3f3f
#define NMAX 5005
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))
#define f first
#define s second

using namespace std;
typedef vector < int > ::iterator vii;

ifstream in ( "secv.in" );
ofstream out ( "secv.out" );

pair < int , int > DP[NMAX];
vector < int > B;
int  A[NMAX] , N , Answer, Next[NMAX]; 

int main ( void )
{
	int i , j ;
	in >> N ;
	for ( i = 1 ; i <= N ; ++i ) in >>A[i] , B.push_back( A[i] );
	B.resize ( distance ( B.begin() , unique( B.begin() , B.end() )));
	sort ( B.begin() , B.end() );
	vii last_pos = B.end() ; --last_pos;
	for ( vii it = B.begin() ; it != last_pos ; ++it )
		Next[*it] = *(it+1);
	for ( i = 1 ; i <= N and i < *B.begin() ; ++i);
	for (++i ; i <= N ; ++i )
	{
		if ( A[i] == *B.begin() ) DP[i].second = i ;
		for ( j = i + 1 ; j <= N ; ++j  )
		   if ( A[j] == Next[A[i]] )
		   {
			   DP[j].first = DP[i].first + 1;
			   DP[j].second = DP[i].second;
		   }
	}
	Answer = INF;
	for ( i = 1 ; i <= N ; ++i )
		if ( A[i] == *last_pos )
			Answer = get_min( Answer , i - DP[i].second +1 );
	out << Answer << "\n";
	in.close();
	out.close();
	return 0 ;	
}