Cod sursa(job #518061)

Utilizator mottyMatei-Dan Epure motty Data 30 decembrie 2010 14:08:11
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int N=5001;

struct element{
	int val, id;
};

int n, d[2][N];

element v[N];

vector <int> a[N];

int cmp( element a, element b)
{
	if(a.val==b.val)
		return (a.id<b.id);
	return (a.val<b.val);
}

void MakeVector()
{
	sort( v+1, v+n+1, cmp);
	
	int poz=1;
	a[1].push_back(v[1].id);
	
	for( int i=2; i<=n; ++i)
	{
		if(v[i].val>v[i-1].val)
			++poz;
		a[poz].push_back(v[i].id);
	}
	
	n=poz;
}

void Read()
{
	in >> n;
	
	for( int i=1; i<=n; ++i)
	{
		v[i].id=i;
		in >> v[i].val;
	}
	
	MakeVector();
}

void MakeFive( int i, int sz)
{
	for( int j=0; j<sz; ++j)
		d[i%2][j]=N+1;
}

void Solve()
{
	int jsz, ksz;
	for( int i=2; i<=n; ++i)
	{
		jsz=a[i-1].size();
		ksz=a[i].size();
	
		MakeFive(i, ksz);
	
		for( int j=0; j<jsz; ++j)
		{
			for( int k=0; k<ksz; ++k)
				if( a[i-1][j] < a[i][k] )
					if( d[i%2][k] > d[(i-1)%2][j] + a[i][k]-a[i-1][j] )
						d[i%2][k] = d[(i-1)%2][j] + a[i][k]-a[i-1][j];
		}
	}
	
	int min=N+1;
	jsz=a[n].size();
	
	for( int i=0; i<jsz; ++i)
		if(a[n%2][i]<min)
			min=d[n%2][i];
	
	out << min+1 << "\n";
}

int main()
{
	Read();
	Solve();
	
	return 0;
}