Pagini recente » Cod sursa (job #105381) | Cod sursa (job #3128537) | Cod sursa (job #2641267) | Cod sursa (job #1658585) | Cod sursa (job #2104759)
/// LONGEST INCREASING SUBSEQUENCE
#include <iostream>
#include <fstream>
#include <utility>
#include <algorithm>
#include <map>
#include <sstream>
#include <memory>
#include <cstring>
#define NMax 100001
///#define f cin
///#define g cout
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, a[NMax], temp[NMax], maxindex, sol[NMax], ans[NMax], foo;
int main()
{
f >> n;
for(int i = 1; i <= n; ++i)
{
f >> a[i];
temp[i] = 1; /// fac cel mai mare subsir crescator ca fiind 1 pt fiecare element
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(a[j] < a[i])
{
temp[i] = max(temp[i], temp[j] + 1); /// daca a[j] < a[i] atunci cel mai mare subsir crescator la pozitia i va fi maximul dintre pozitia aia si pozitia lui j + 1
sol[i] = j;
}
for(int i = 1; i <= n; ++i)
if(temp[i] > temp[maxindex]) maxindex = i;
g << temp[maxindex] << '\n';
int t = maxindex, newt = maxindex;
do
{
t = newt;
ans[++foo] = a[t];
newt = sol[t];
}while(t != newt);
for(int i = foo - 1; i >= 1; --i)
g << ans[i] << " ";
return 0;
}