Cod sursa(job #3194526)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 18 ianuarie 2024 12:41:16
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
#include <stack>
#include <set>
#include <map>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

const int nmax = 100005;
int n;
int v[nmax];
int best[nmax];
int pre[nmax];
int lung_max;
int start_poz;
void scmax()
{
	for (int i = n; i >= 1; i--) {
		best[i] = 1;
		pre[i] = -1;
		for (int j = i + 1; j <= n; j++) {
			if (v[j] > v[i]) {
				if (best[j] + 1 > best[i]) {
					best[i] = best[j] + 1;
					pre[i] = j;
				}
			}
		}
		if (best[i] > lung_max)
		{
			lung_max = best[i];
			start_poz = i;
		}
	}
	/*
	if (best[poz] != -1) {
		return best[poz];
	}

	int best_lmax = 1; /// cea mai buna varianta de la pozitia k
	for (int i = poz + 1; i <= n; i++) {
		if (v[i] > v[poz]) {
			int lmax_from_i = scmax(i);
			if (lmax_from_i + 1 > best_lmax) {
				best_lmax = lmax_from_i + 1;
			}
		}
	}

	best[poz] = best_lmax;
	return best[poz];*/
}

int main()
{
	f >> n;
	for (int i = 1; i <= n; i++)
	{
		f >> v[i];
	}
	scmax();
	/*
	for (int i = 1; i <= n; i++)
	{
		int lung_i = scmax(i);
		if (lung_i > lung_max)
		{
			lung_max = lung_i;
			start_poz = i;
		}
	}
	*/
	g << lung_max << '\n';
	bool last = 0;
	while (!last)
	{
		if (pre[start_poz] == -1)
		{
			last = 1;
		}
		g << v[start_poz] << ' ';
		start_poz = pre[start_poz];
	}
}