Pagini recente » Cod sursa (job #929299) | Cod sursa (job #1530600) | Cod sursa (job #1821822) | Cod sursa (job #2777177) | Cod sursa (job #2434126)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
class Solution {
vector<int> v;
int n;
vector<int> pr;
int pos = 0;
public:
void readData() {
ifstream f("scmax.in");
f >> n;
v.resize(n, 0);
pr.resize(n, -1);
for (int i = 0; i < n; ++i) {
f >> v[i];
}
}
int scmax() {
vector<int> dp(n); // in explicatii indexarea incepe de la 1
// caz de baza
dp[0] = 1; // [ v[1] ] este singurul subsir (crescator) care se termina pe 1
pr[0] = -1;
// caz general
for (int i = 1; i < n; ++i) {
dp[i] = 1; // [ v[i] ] - este un subsir (crescator) care se termina pe i
// incerc sa il pun pe v[i] la finalul tuturor solutiilor disponibile
// o solutie se termina cu un element v[j]
for (int j = 0; j < i; ++j) {
// solutia triviala: v[i]
if (v[j] < v[i]) {
// din (..., v[j]) pot obtine (..., v[j], v[i])
// (caz in care prec[i] = j)
// voi alege j-ul curent, cand alegerea imi gaseste o solutie mai buna decat ce am deja
if (dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
pr[i] = j;
}
}
}
}
// solutia e maximul din vectorul dp
int sol = dp[0];
for (int i = 1; i < n; ++i) {
if (dp[i] > sol) {
sol = dp[i];
pos = i;
}
}
return sol;
}
void print() {
ofstream g("scmax.out");
g << scmax() << '\n';
stack<int> myStack;
while (pos != -1) {
myStack.push(v[pos]);
pos = pr[pos];
}
while (!myStack.empty()) {
g << myStack.top() << ' ';
myStack.pop();
}
}
};
int main() {
Solution sol;
sol.readData();
sol.print();
}