Pagini recente » Cod sursa (job #2121490) | Cod sursa (job #2617667) | Cod sursa (job #1145879) | Cod sursa (job #286593) | Cod sursa (job #2001997)
#include <cstdio>
#include <vector>
#include <numeric>
#include <stack>
using namespace std;
#define NAME "scmax"
auto fin = fopen(NAME ".in", "r");
auto fout = fopen(NAME ".out", "w");
int n;
vector<int> v;
int main() {
fscanf(fin, "%d", &n);
v.resize(n);
for (auto i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
vector<int> best, pre;
best.resize(n, 1);
pre.resize(n, -1);
for (auto i = 0; i < n; ++i) {
int maxlen = 0;
for (auto j = 0; j < i; ++j)
if (v[j] < v[i] && best[j] > maxlen) {
maxlen = best[j];
pre[i] = j;
}
best[i] += maxlen;
}
int maxleni = 0;
for (auto i = 0; i < best.size(); ++i)
if (best[maxleni] < best[i])
maxleni = i;
stack<int> s;
while (maxleni != -1) {
s.push(v[maxleni]);
maxleni = pre[maxleni];
}
fprintf(fout, "%d\n", s.size());
while (!s.empty()) {
auto val = s.top();
s.pop();
fprintf(fout, "%d ", val);
}
return 0;
}
// Brute force solution
// int n;
// vector<int> v;
// vector<int> solution;
// vector<int> current;
// void find(int level, int start_i) {
// auto solution_sum = accumulate(solution.begin(), solution.end(), 0);
// auto current_sum = accumulate(current.begin(), current.end(), 0);
// if (current_sum > solution_sum)
// solution = current;
// for (auto i = start_i; i < n; ++i) {
// if (!current.size() || v[i] > current.back()) {
// current.push_back(v[i]);
// find(level + 1, i + 1);
// current.pop_back();
// }
// }
// }
// int main() {
// fscanf(fin, "%d", &n);
// v.resize(n);
// for (auto i = 0; i < n; ++i)
// fscanf(fin, "%d", &v[i]);
// find(0, 0);
// for (auto val: solution)
// printf("%d ", val);
// printf("\n");
// return 0;
// }