Mai intai trebuie sa te autentifici.
Cod sursa(job #2254787)
Utilizator | 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;
}