Pagini recente » Cod sursa (job #2797731) | Cod sursa (job #2722005) | Cod sursa (job #1367970) | Cod sursa (job #1145495) | Cod sursa (job #1766037)
#include <iostream>
#include <fstream>
//Subsir strict crescator maximal
using namespace std;
const int MAXN = 100001;
ifstream f("scmax.in");
ofstream g("scmax.out");
int N, a[MAXN]; //Datele de intrare
int L[MAXN]; //L[i] = lungimea maxima a unui subsir crescator care se termina pe pozitia i
int P[MAXN]; //P[i] = pozitia primului element care este succesor al lui a[i]
//P[i] = -1 ==> nu exista succesor
int lmax; //Lungimea maxima a unui subsir crescator
int poz; //Pozitia primului element din subsir
void dinamica()
{
L[N] = 1;
P[N] = -1;
lmax = 1;
poz = N;
for(int i = N - 1; i >= 1; i--)
{
P[i] = -1;
int maxs = 0;
for(int j = i + 1; j <= N; j++)
if(a[i] < a[j] && maxs < L[j])
{
maxs = L[j];
P[i] = j;
}
L[i] = 1 + maxs;
if(L[i] > lmax)
{
lmax = L[i];
poz = i;
}
}
}
void subsir()
{
int i = poz;
while(i != -1)
{
g << a[i] << ' ';
i = P[i];
}
}
int main()
{
f >> N;
for(int i = 1; i <= N; i++)
f >> a[i];
dinamica();
g << lmax << '\n';
subsir();
f.close();
g.close();
return 0;
}