Pagini recente » Cod sursa (job #24957) | Cod sursa (job #2483578) | Cod sursa (job #3288599) | Rating Mihail Prunaru (Mihailprunaru) | Cod sursa (job #1870504)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 1e5 + 5;
const int INF = 0x7FFFFFFF;
int n;
int dp[N_MAX], v[N_MAX], sol[N_MAX];
void read() {
ifstream fin("scmax.in");
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> v[i];
fin.close();
}
void solve() {
for (int i = n; i >= 1; --i) {
int maxim = 0;
sol[i] = n + 1;
for (int j = i + 1; j <= n; ++j) {
if (v[i] >= v[j])
continue;
if (maxim < dp[j]) {
maxim = dp[j];
sol[i] = j;
} else if (maxim == dp[j] && v[sol[i]] > v[j]) {
sol[i] = j;
}
}
dp[i] = maxim + 1;
}
}
void write() {
ofstream fout("scmax.out");
int *maxdp = max_element(dp + 1, dp + n + 1);
int minim = INF;
int start = 0;
for (int i = 1; i <= n; ++i) {
if (dp[i] == *maxdp) {
if (minim > v[i]) {
minim = v[i];
start = i;
}
}
}
fout << *maxdp << '\n';
int j = start;
while (j <= n) {
fout << v[j] << ' ';
j = sol[j];
}
fout.close();
}
int main() {
read();
solve();
write();
return 0;
}