Pagini recente » Istoria paginii utilizator/arsene_denisa | Istoria paginii utilizator/solo22 | Algoritmiada 2015 - Clasament Runda 2, Juniori | Cod sursa (job #419796) | Cod sursa (job #402568)
Cod sursa(job #402568)
/*
@ 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;
}