Mai intai trebuie sa te autentifici.

Cod sursa(job #2254787)

Utilizator DRLDRLRaul Ronald Galea DRLDRL Data 5 octombrie 2018 22:57:38
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#pragma once

#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;

ifstream fin("subsiruri.in");
ofstream fout("subsiruri.out");

vector<int> sir, dp, nr, pp;

void bu() {
	int maxJ;
	dp.resize(sir.size());
	nr.resize(sir.size());
	pp.resize(sir.size());
	fill(dp.begin(), dp.end(), 1);
	fill(nr.begin(),nr.end(), 1);
	for (int i = 1; i < sir.size(); i++) {
		maxJ = 0;
		for (int j = 0; j < i; j++) {
			if (sir[i] > sir[j]) {

				if (dp[j] == maxJ) {
					nr[i] += nr[j] % 9901;
				}

				if (dp[j] > maxJ) {
					maxJ = dp[j];
					nr[i] = nr[j];
					pp[i] = j;
				}
			}
		}
		dp[i] = maxJ + 1;
	}
}




int main() {
	vector<int> lis;
	int n, lmax = -1, current = -1;
	fin >> n;
	sir.resize(n);
	for (int i = 0; i < n; i++)
		fin >> sir[i];
	bu();
	for (int i = 0; i < n; i++) {
		if (lmax < dp[i]) {
			lmax = dp[i];
			current = i;
		}
	}
	fout << lmax << " \n";
	//fout << nr[pos] << "\n";
	int nr = lmax;
	while (nr > 0) {
		lis.push_back(sir[current]);
		current = pp[current];
		nr--;
	}

	for (int i = lis.size() - 1; i >= 0; --i)
		fout << lis[i] << " ";
	return 0;
}