Pagini recente » Cod sursa (job #44303) | Cod sursa (job #2399459) | Cod sursa (job #728410) | Cod sursa (job #2551667) | Cod sursa (job #3194526)
#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];
}
}