Cod sursa(job #2138521)

Utilizator IronWingVlad Paunescu IronWing Data 21 februarie 2018 18:24:35
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <string>
#include <iostream>    
#include <fstream>

#define MAXN 100000

int N, a[MAXN] = { 0 }, best[MAXN] = { 0 };
int prevs[MAXN] = { 0 };

int main()
{
	using namespace std;
	string infile = "scmax.in";
	string outfile = "scmax.out";



	ifstream f(infile.c_str(), std::ifstream::in);

	f >> N;
	for (int i = 0; i < N; ++i) {
		f >> a[i];
	}

	f.close();

	best[0] = 1;
	prevs[0] = -1;

	for (int i = 1; i < N; ++i) {
		int max_id = -1;
		int max_so_far = 0;
		for (int j = 0; j < i; ++j) {
			if (a[i] <= a[j]) {
				continue;
			}
			if (best[j] > max_so_far) {
				max_so_far = best[j];
				max_id = j;
			}
		}
		best[i] = max_so_far + 1;
		prevs[i] = max_id;
	}
	
	ofstream g(outfile.c_str(), std::ofstream::out);
	int best_id = -1;
	int best_sol = 0;
	for (int i = 0; i < N; ++i) {
		if (best[i] > best_sol) {
			best_id = i;
			best_sol = best[i];
		}
	}

	int drum[MAXN];
	int i = 0;
	while (best_id != -1) {
		drum[i++] = a[best_id];
		best_id = prevs[best_id];
	}


	g << best_sol << std::endl;
	for (int i = best_sol - 1; i >= 0; i--) {
		g << drum[i] << " ";
	}

	g << std::endl;
	g.close();


    return 0;
}