Pagini recente » Cod sursa (job #325013) | Cod sursa (job #670592) | Cod sursa (job #2162190) | Cod sursa (job #1808834) | Cod sursa (job #1456813)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in;
ofstream out;
int v[100000], l[100000], pre[100000], M, p;
void findSub (int n) {
int i = n - 2;
l[n-1] = 1;
pre[n-1] = -1;
p = 0;
M = 0;
while (i >= 0) {
l[i] = 1;
pre[i] = -1;
for (int j = i+1; j < n; ++j) {
if ((v[j] > v[i]) && (l[i] < (l[j] + 1))) {
l[i] = l[j] + 1;
pre[i] = j;
if (l[i] > M) {
M = l[i];
p = i;
}
}
}
--i;
}
}
void printSub () {
int i = p;
if (pre[i] == -1) {
out << "1\n";
out << v[0];
} else {
out << M << "\n";
while (i != -1) {
out << v[i] << " ";
i = pre[i];
}
}
}
int main (void) {
in.open("scmax.in");
out.open("scmax.out");
int n;
in >> n;
for (int i = 0; i < n; ++i) {
in >> v[i];
}
findSub(n);
printSub();
in.close();
out.close();
return 0;
}