Cod sursa(job #402568)

Utilizator TabaraTabara Mihai Tabara Data 23 februarie 2010 22:49:20
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
/*
@ Mihai Tabara, 2010
CMLSCM ( subsir crescator maximal )
O(N^2) - time
	   - memory
*/

#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

const char* in = "scmax.in";
const char* out = "scmax.out";
const int NMAX = 100005;

int best[NMAX], tata[NMAX];
int A[NMAX], N;
vector<int> sol;

template<typename T>
inline T maxim ( T a, T b ) { return ((a) > (b) ? (a) : (b)); }

int main ( void )
{
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf ( "%d", &N );
	int i, j, max, ok;

	for ( i = 1; i <= N; scanf( "%d", A+i++ ) );

	best[ max = 0] = 0;
	for ( i = 1; i <= N; ++i )
	{
		best[i] = 1;
		tata[i] = i;
		for ( j = 1; j < i; ++j )
			if ( A[j] < A[i] && best[i] < best[j] + 1 )
			{
				best[i] = best[j] + 1;
				tata[i] = j;
				if( best[i] > max ) { max = best[i]; ok = i; }
			}
	}

	printf ( "%d\n", max );
	for ( i = ok; ; i = tata[i] ) 
	{
		sol.push_back ( A[i] );
		if ( tata[i] == i ) break;
	}
	reverse ( sol.begin(), sol.end() );
	for ( i = 0; i < sol.size(); ++i )
		printf ( "%d ", sol[i] );

	return 0;
}