Pagini recente » Cod sursa (job #2584484) | Cod sursa (job #2110483) | Cod sursa (job #2365079) | Cod sursa (job #1517834) | Cod sursa (job #2961087)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
// ifstream cin("input");ofstream cout("output");
ifstream cin("scmax.in");ofstream cout("scmax.out");
// SOLUTIE O(N^2)
vector<int> numere;
vector<int> dp; // dp[i] = lungimea celui mai lung subsir strict crescator care se termina in i
vector<int> inainte;
int main(){
int n;
cin>>n;
numere.resize(n+1);
dp.resize(n+1, 0);
inainte.resize(n+1);
for (int i=1; i<=n; i++){
cin>>numere[i];
}
numere[0] = 0;
dp[0] = 0; // start - pe pozitia 0 nu am niciun element in subsir
for (int i=1; i<=n; i++){
for (int j=0; j<i; j++){
if (numere[j] < numere[i]){ // am gasit un numar mai mic
if (dp[j] + 1 > dp[i]){ // pot face un subsir mai lung
dp[i] = dp[j] + 1; // imi retin lungimea maxima
inainte[i] = j; // imi retin de unde am venit
}
}
}
}
int ultimaPozitie = 0;
for (int i=1; i<=n; i++){
if (dp[i] > dp[ultimaPozitie]){
ultimaPozitie = i; // cea mai buna ultima pozitie
}
}
vector<int> raspuns;
while (ultimaPozitie != 0){
raspuns.push_back(numere[ultimaPozitie]);
ultimaPozitie = inainte[ultimaPozitie];
}
reverse(raspuns.begin(), raspuns.end());
cout<<raspuns.size()<<'\n';
for (auto &x : raspuns){
cout<<x<<" ";
}
cout<<'\n';
}