Cod sursa(job #1456813)

Utilizator aimrdlAndrei mrdl aimrdl Data 1 iulie 2015 23:34:40
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in;
ofstream out;
int v[100000], l[100000], pre[100000], M, p;

void findSub (int n) {
	int i = n - 2;
	l[n-1] = 1;
	pre[n-1] = -1;
	p = 0;
	M = 0;
	
	while (i >= 0) {
		l[i] = 1;
		pre[i] = -1;
		for (int j = i+1; j < n; ++j) {
			if ((v[j] > v[i]) && (l[i] < (l[j] + 1))) {
				l[i] = l[j] + 1;
				pre[i] = j;
				
				if (l[i] > M) {
					M = l[i];
					p = i;
				}
			}
		}
		--i;
	}
}

void printSub () {
	int i = p;
	if (pre[i] == -1) {
		out << "1\n";
		out << v[0];
	} else {
		out << M << "\n";
		while (i != -1) {
			out << v[i] << " ";
			i = pre[i];
		}
	}
}
		
int main (void) {
	in.open("scmax.in");
	out.open("scmax.out");
	
	int n;
	in >> n;
	
	for (int i = 0; i < n; ++i) {
		in >> v[i];
	}
	
	findSub(n);
	printSub();
	
	in.close();
	out.close();
	return 0;
}