Pagini recente » Cod sursa (job #579066) | Cod sursa (job #2530850) | Cod sursa (job #2810602) | Cod sursa (job #1495574) | Cod sursa (job #1129437)
#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 ;
}